将值分配给动态分配的2d指针数组时出现语法错误

时间:2015-09-23 09:23:12

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

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

  

2第11行和第12行的警告:int的间接等级不同   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;
}

我在这里犯了什么错误?

4 个答案:

答案 0 :(得分:1)

您的代码存在许多问题。第一个是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;

答案 1 :(得分:1)

  

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

你不能这样做。例如:

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];

您可以进行直接分配的唯一时间是自动数组初始化,例如上面代码段中的a,其中未命名数组{1, 2, 3}在概念上被复制到元素a

正如约阿希姆所说,确保你保持在界限内。 [0, n − 1]是允许为大小为n的数组解除引用的范围。因此,a[3] = 4;是非法的,因为a的大小为3,虽然它很乐意编译,但你正在踩UB land

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

答案 2 :(得分:0)

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

#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;
}

答案 3 :(得分:0)

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

#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;
}