当实际和外部类型不同时会发生什么?

San*_*eep 2 c arrays pointers extern

我有两个文件:

AC

extern char *s;
int main()
{
    puts(s);
}
Run Code Online (Sandbox Code Playgroud)

和bc:

char s[] = "hello";
Run Code Online (Sandbox Code Playgroud)

我同时编译它们,没有错误.但是程序在运行时崩溃了.为什么?C语言规范的哪一部分说这是非法的?

Mik*_*CAT 6

您调用了未定义的行为,程序碰巧崩溃了.

N1256 6.2.7兼容型和复合型

1如果类型相同,则两种类型具有兼容类型.用于确定两种类型是否兼容的附加规则在6.7.2中描述了类型说明符,在6.7.3中描述了类型限定符,在6.7.5中描述了声明符.[...]

2涉及同一对象或功能的所有声明均应具有兼容类型; 否则,行为未定义.

在典型的环境中,当程序运行时,存储的内容将被读作指针,因为声明表明指针在那里a.c,但实际上是字符串的一部分(如果指针的大小是4个字节)并且它几乎没有成为有效指针的机会.因此,从该地址读取很有可能导致分段错误.

  • @Sandeep:数组不是指针.在注释中修改后的代码中,你已经将`s`定义为`char*`并将其用作`char*`并用有效的`char*`初始化它所以一切都很好.在这个问题中,你已经对编译器产生了影响; 你告诉它`s`是一个`char*`但实际上它是一个`char`数组,崩溃就是编译器告诉你它不喜欢被告知谎言的方式. (4认同)