You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 03:33:13