【发布时间】:2020-05-12 09:25:12
【问题描述】:
我有一个简单的 C 代码:
int main()
{
int test[10] = {1,2,3,4,5,6,7,8,9,10};
int **ptr = &test;
printf("%d\n", (*ptr)[0]);
return 0;
}
一旦到达printf 行,它就会崩溃:
Process returned -1073741819 (0xC0000005) execution time : 0.865 s
在 Ubuntu 上编译代码时,它给了我警告:
test.c:8:17: warning: initialization from incompatible pointer type [-Wincompatible-pointer-types]
int **ptr = &test;
但是,如果我改为在堆上动态分配内存,则代码有效:
int main()
{
int *test = malloc(sizeof(int)*10);
for (int i = 0; i < 10; i++) {
test[i]=i;
}
int **ptr = &test;
printf("%d\n", (*ptr)[1]);
return 0;
}
请解释一下,为什么当数组在堆上而不是在栈上时代码可以工作?
【问题讨论】:
-
main.c:5:11: warning: incompatible pointer types initializing 'int **' with an expression of type 'int (*)[10]' [-Wincompatible-pointer-types] int **ptr = &test; -
[cquery] incompatible pointer types initializing 'int **' with an expression of type 'int (*)[10]' [-Wincompatible-pointer-types],不用编译... -
int *ptr = test;和printf("%d\n", ptr[0]);似乎更理智/预期的用例。 -
仅供参考,
int **ptr = &test;无效 C。使用-pedantic-errors时,GCC 会出现错误。
标签: c windows pointers mingw double-pointer