我想直接将值分配给动态分配内存的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;
}
我在这里犯了什么错误?
答案 0 :(得分:1)
您的代码存在许多问题。第一个是pmat1
只是int
指针数组的数组,其他(pmat2
和pmat3
)只是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]
的数组)分配给*p
,int
。如果你愿意,一个一个地去做:
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;
}