C语言函数外部(头文件中)字符串数组赋值报错原因咨询
函数外部变量赋值规则与编译错误解析
可正常运行的代码
#include <stdio.h> char *arr[1] = {"Hello"}; int main() { printf("%s", arr[0]); return 0; }
无法运行的代码
#include <stdio.h> char *arr[1]; arr[0] = "Hello"; int main() { printf("%s", arr[0]); return 0; }
编译时会出现如下错误:
warning: type defaults to ‘int’ in declaration of ‘arr’ [-Wimplicit-int]
main.c:4:1: error: conflicting types for ‘arr’; have ‘int[0]’
函数外部(全局作用域)的变量赋值规则
- 全局作用域内只能放置变量的声明或定义语句,不能直接写可执行的赋值表达式(比如单独的
arr[0] = "Hello";属于可执行语句,必须放在函数内部)。 - 全局变量的初始化必须和定义绑定在一起,也就是在声明变量的同时用
=完成初始化,比如第一个示例中char *arr[1] = {"Hello"};的写法。
错误原因解析
第二份代码里的arr[0] = "Hello";写在全局作用域,编译器无法识别这是赋值操作,反而会把它当成一个新的变量声明来处理:
- 因为这条语句没有指定变量类型,老C标准允许隐式默认
int类型,所以触发“type defaults to ‘int’”的警告。 - 这个隐式声明的
arr和之前已经定义的char *arr[1]类型完全冲突:前者被默认解析为int类型数组,后者是指向char的指针数组,因此编译器报出“conflicting types for ‘arr’”的错误。
内容的提问来源于stack exchange,提问作者user
相关产品推荐
相关产品推荐

