为何C语言中数组的地址无法赋值给指向指针的指针?
关于C语言中数组地址与int**指针赋值的疑问
核心疑问
我原本以为在C语言中,对int类型数组使用&运算符后,结果应该可以赋值给int**类型指针,就像直接将int数组赋值给int*类型指针那样(此处的int只是示例类型)。
示例代码
#include <stdio.h> int main() { int** a; int b[5]; b[1] = 123; //a = &b; //< 会触发警告:assignment to ‘int **’ from incompatible pointer type ‘int (*)[5]’ int* c = b; a = &c; //< 此语句可正常运行 printf("*a is %i\n", (*a)[1]); return 0; }
已了解的信息
&b的类型是指向int数组的指针,即int (*)[5](对应变长数组则为int (*)[])。- 参考C标准条款ISO/IEC 9899:1999 6.3.2.1/4:
除非数组表达式是
sizeof运算符、一元&运算符的操作数,或是用于初始化数组的字符串字面量,否则类型为“type数组”的表达式会被转换为类型为“指向type的指针”的表达式,指向数组对象的首元素,且该表达式不是左值。
补充疑问
虽然知道a = &b这种写法不可行,但我仍未找到C语言不支持这一特性的原因。允许这样的赋值会引发什么问题吗?比如调用free(*a)的情况,我认为这和调用free(c)并无区别。另外,我不需要“你应该这么做”这类规范做法的建议,只想了解背后的原因。
内容的提问来源于stack exchange,提问作者Maarten ten Velden
相关产品推荐
相关产品推荐

