San*_*eep 2 c arrays pointers extern
我有两个文件:
extern char *s;
int main()
{
puts(s);
}
Run Code Online (Sandbox Code Playgroud)
char s[] = "hello";
Run Code Online (Sandbox Code Playgroud)
我同时编译它们,没有错误.但是程序在运行时崩溃了.为什么?C语言规范的哪一部分说这是非法的?
您调用了未定义的行为,程序碰巧崩溃了.
1如果类型相同,则两种类型具有兼容类型.用于确定两种类型是否兼容的附加规则在6.7.2中描述了类型说明符,在6.7.3中描述了类型限定符,在6.7.5中描述了声明符.[...]
2涉及同一对象或功能的所有声明均应具有兼容类型; 否则,行为未定义.
在典型的环境中,当程序运行时,存储的内容将被读作指针,因为声明表明指针在那里a.c,但实际上是字符串的一部分(如果指针的大小是4个字节)并且它几乎没有成为有效指针的机会.因此,从该地址读取很有可能导致分段错误.
| 归档时间: |
|
| 查看次数: |
58 次 |
| 最近记录: |