代码之家  ›  专栏  ›  技术社区  ›  youpilat13 Ty Petrice

正确的分配语法

  •  0
  • youpilat13 Ty Petrice  · 技术社区  · 9 年前

    如果我取下面两个截取的代码(它们是等价的):

    double ***x;
    x = malloc(N * sizeof(*x));
    for (i = 0; i < size_y; i++) {
       x[i] = malloc(N * sizeof(**x));
    

    double ***x;
    x = malloc(N * sizeof(double*));
    for (i = 0; i < size_y; i++) {
       x[i] = malloc(N * sizeof(double**));
    

    上面第一个的语法应该是:

    double ***x;
    x = malloc(N * sizeof(*x));
    for (i = 0; i < size_y; i++) {
       x[i] = malloc(N * sizeof(*x));
    

    我是说,因为 x , x[i] x[i][j] malloc 分配时,语法将保持不变” sizeof(*x) ”“对吗?

    ??

    第二个应该是:

    double ***x;
    x = malloc(N * sizeof(double**));
    for (i = 0; i < size_y; i++) {
       x[i] = malloc(N * sizeof(double*));
    

    ??

    我从中看到了这个语法 this link

    这更安全,因为您不必两次提到类型名,而且 不必为“取消引用”版本的 类型。例如,您不必在

    int****p=malloc(100*sizeof*p);

    将其与中基于类型的sizeof进行比较

    int****p=malloc(100*sizeof(int****);

    如果您也有,请确保在下面使用了正确的*数 sizeof。

    当做

    更新1:

    我在下面的一个答案中得到了作为模式的语法:

    p = malloc(N * sizeof *p);
    

    空格(在 N , sizeof *p )和父母的缺席 sizeof *p (代替 sizeof(*p) )必须严格应用于此分配的语法?

    在我的代码中,我做了:

     /* Arrays */
      double**  x;
      double**  x0;
    
    /* Allocation of 2D arrays */
      x =  malloc(size_tot_y*sizeof(*x));
      x0 =  malloc(size_tot_y*sizeof(*x0));
    
      for(i=0;i<=size_tot_y-1;i++)
      {
        x[i] = malloc(size_tot_x*sizeof(**x));
        x0[i] = malloc(size_tot_x*sizeof(**x0));
      }
    

    如您所见,我使用括号表示 大小 并且没有使用空格 size_tot_* , 大小 *p .

    我的语法是否有任何改变,以尊重上述模式?

    这可能是个愚蠢的问题,但我想得到确认。

    谢谢

    2 回复  |  直到 8 年前
        1
  •  1
  •   M.M    9 年前

    模式是:

    p = malloc(N * sizeof *p);
    

    代替 p 在两种情况下都是一样的。例如:

    x[i] = malloc(N * sizeof *x[i]);
    

    有时人们缩写 *x[i] **x 利用以下知识: **x 方法 *x[0] x[0] x[i] 具有相同的大小,因为数组的所有元素必须具有相同的类型,因此大小相同。

    但是,如果您对所有这些都没有信心,那么您可以坚持基本模式并使用 *x[i] .

        2
  •  -1
  •   Salah Uddin    9 年前

    有两件事,

    • 指针保存分配空间的地址,并且
    • malloc()分配所提供的空间大小。所以 马洛克(1) 将分配1字节, malloc(sizeof(double)) 将分配需要加倍的字节数(可以是8字节), malloc(sizeof(double*)) 将分配该地址所需的字节数(可能是4字节)。

    所以 对于第一参考,

    double *d1 = (double *) mallloc(sizeof(double)); // for single value
    

    double *d1 = (double *) malloc(N * sizeof(double));  // for array
    

    类似地,对于第二参考,

    double **d2 = (double **) malloc(N * sizeof(double *));
    

    并且对于第三参考,

    double ***d3 = (double ***) malloc(N * sizeof(double *));
    

    现在,我们可以考虑,

    void mallocTest()
    {
        const int N = 10;
        double ***x;
    
        x = (double ***)malloc(N * sizeof(double *));
        for (int i = 0; i < N; i++) {
            x[i] = (double **)malloc(N * sizeof(double *));
            for (int j = 0; j < N; j++) {
                x[i][j] = (double *)malloc(sizeof(double));       // for single value;
                //x[i][j] = (double *)malloc(N * sizeof(double));    // for array, here N == 10 elements
    
                *x[i][j] = i*j;  // or
                //x[i][j][0] = i*j;
            }
        }
    
        for (int i = 0; i < N; i++){
            for (int j = 0; j < N; j++){
                //printf("%f ", *x[i][j]);     // or
                printf("%f ", x[i][j][0]);
            }
            printf("\n");
        }
    }