C语言编译报invalid initializer错误的原因是什么?
问题原因分析
首先明确两个相近声明的语义差异:
int *ar[10]:由于[]优先级高于*,这是指针数组,本质是长度为10的数组,每个元素的类型是int*。int (*ar)[10]:括号提升了*的优先级,这是数组指针,本质是一个指针,指向的对象是长度为10的int类型数组。
报错的核心原因
C语言语法规定:数组名是不可修改的左值,不能直接用单个指针对整个数组进行初始化/赋值。malloc返回的是void*类型的地址指针,你尝试用单个指针值初始化一个数组类型的变量,完全不符合类型匹配规则,编译器自然会抛出invalid initializer错误。
你注释掉的那行写法是合法的:因为int (*ar)[10]是指针类型,和malloc返回的指针类型匹配(C语言允许void*隐式转换为其他类型的指针)。
延伸说明
如果你确实需要使用指针数组int *ar[10],需要单独为每个数组成员分配内存,示例写法如下:
int *ar[10]; for(int i=0; i<10; i++) { ar[i] = malloc(sizeof(int) * SIZE); }
如果你需要的是指向数组的指针,直接使用你注释的写法即可。
内容的提问来源于stack exchange,提问作者milanHrabos
相关产品推荐
相关产品推荐

