【问题标题】:Syntax error when assigning values to a dynamically allocated 2d array of pointers将值分配给动态分配的二维指针数组时出现语法错误
【发布时间】:2015-12-20 13:00:22
【问题描述】:

我想直接将值分配给动态分配内存的二维指针数组。但编译器显示 2 个警告和 1 个错误。

第 11 行和第 12 行的 2 个警告:int 的间接级别不同于 整数*。

第 13 行错误:语法错误:'{'

这是我的代码:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int r , c, rc;
    int* pmat1[3][3], pmat2[3][3], pmat3[3][3];

    *pmat1[3] = (int*)calloc(3,sizeof(int));
    *pmat2[3] = (int*)calloc(3,sizeof(int));
    *pmat3[3] = (int*)calloc(3,sizeof(int));

    *pmat1[3][3] = { {1,1,1}, {0,0,0}, {2,2,2} };
    return 0;
}

我在这里犯了什么错误?

【问题讨论】:

  • 请不要强制转换malloc
  • 在您的代码中,pmat2pmat3 是二维整数数组。可能您想以这种方式声明它们:int* pmat1[3][3], *pmat2[3][3], *pmat3[3][3].
  • 您是在转换 calloc 是因为您收到一些警告,在这种情况下您使用了错误的编译器,或者您转换 calloc 因为您不知道 calloc(及其家族)的返回类型是 void * ?
  • 您想要一个指向数组的指针的二维数组、指向二维数组的指针还是指向二维数组的指针数组?这些都是非常不同的东西,您的代码似乎想要将它们全部结合起来。
  • int* x, y, z; 等价于int* x; int y; int z;

标签: c arrays pointers multidimensional-array dynamic-memory-allocation


【解决方案1】:

我想直接将值分配给动态分配内存的二维指针数组。

你不能这样做。例如:

int *p = malloc(sizeof(*p) * 3);
*p = {1, 2, 3};

完全错误。您将{1, 2, 3}int[3] 类型的数组)分配给*pint。如果需要,请一一做:

int a[] = {1, 2, 3};
for (size_t i = 0u; i < 3u; ++i)
    p[i] = a[i];

唯一可以直接赋值的时候是在自动数组初始化中,比如上面sn-p中的a,其中未命名的数组{1, 2, 3}在概念上被复制到@987654330的元素中@。

正如 Joachim 所说,请确保您保持在界限内。 [0, n − 1] 是允许为大小为 n 的数组取消引用的范围。因此a[3] = 4; 是非法的,因为a 的大小为3,虽然它会很高兴地编译,但你正在踩UB land

在 C 的指针声明语法中,* 运算符与标识符相关联,而不是与类型相关联。在int* a, b; 中,虽然* 写在int 旁边,但类型仍然是int 而不是int*。只有aint* 类型,而b 仍然是int

【讨论】:

    【解决方案2】:

    并且,下面的代码显示了指针数组如何存储字符串类型的值,

    #include <stdio.h>
    
    const int MAX = 4;
    
    int main ()
    {
       char *names[] = {
                       "Zara Ali",
                       "Hina Ali",
                       "Nuha Ali",
                       "Sara Ali",
       };
       int i = 0;
    
       for ( i = 0; i < MAX; i++)
       {
          printf("Value of names[%d] = %s\n", i, names[i] );
       }
       return 0;
    }
    

    【讨论】:

      【解决方案3】:

      请看下面的代码,这段代码展示了指针数组如何存储整数类型的值,

      #include <stdio.h>
      
      const int MAX = 3;
      
      int main ()
      {
         int  var[] = {10, 100, 200};
         int i, *ptr[MAX];
      
         for ( i = 0; i < MAX; i++)
         {
            ptr[i] = &var[i]; /* assign the address of integer. */
         }
         for ( i = 0; i < MAX; i++)
         {
            printf("Value of var[%d] = %d\n", i, *ptr[i] );
         }
         return 0;
      }
      

      【讨论】:

      • 所以,你说的是我只能指向一个数组的值,不能直接将字面量分配给动态指针
      • 根据指针定义:指针可以存储另一个变量的地址。
      • 在这里,我只想说,如果你想利用指针,那么你应该只存储另一个变量的地址。如果你想存储简单的值,那么你应该采用简单的 int 数组。
      【解决方案4】:

      你的代码有很多问题。第一个是只有pmat1是指向int的指针数组,其他(pmat2pmat3)只是int的数组数组(即不是指针)。

      第二个问题是初始化,你根本不能这样赋值,你必须分别初始化每个字段。

      第三,*pmat1[3] 没有做你可能期望它做的事情,除了它超出范围,因为数组索引从零开始。


      如果我们要深入到更基础的层面,如果你想要的是一个由三个整数组成的三个数组的数组,那么你就完全错了,那么就足够了

      int pmat1[3][3];
      

      以上将导致编译器为总共九 (3 * 3) 个int 分配空间。无需任何动态分配。

      然后你可以像这样初始化它

      pmat1[0][0] = pmat1[0][1] = pmat1[0][2] = 1;
      pmat1[1][0] = pmat1[1][1] = pmat1[1][2] = 0;
      pmat1[2][0] = pmat1[2][1] = pmat1[2][2] = 2;
      

      【讨论】:

        猜你喜欢
        • 2016-10-04
        • 2011-07-28
        • 1970-01-01
        • 2013-03-07
        • 2016-04-19
        • 1970-01-01
        • 1970-01-01
        • 2013-11-08
        • 1970-01-01
        相关资源
        最近更新 更多