[英]c program involving linking get strange output
在s1.c
:
#include <stdio.h>
int foo();
struct t1 {
int j; int k; int i;
} a;
int main() {
foo();
printf("%d %d %d\n", a.i, a.j, a.k); }
在sc
:
struct t1 {
int i; int j; int k;
} a;
int foo() {
a.i = 5; a.j = 7; a.k = 9;
return 0;
}
用gcc sc s1.c -o ee
编译
使用./ee
运行,我得到以下输出: 9 5 7
。
我知道这与链接有关,但是这样做的原因是什么?
该程序表现出未定义的行为:当一个翻译单元中的struct
声明与另一翻译单元中的struct
声明不匹配时,该程序将被错误定义,并且可以执行任何操作。
在这种情况下,您很幸运,程序以相反的顺序打印数字。 尽管它是在您的系统上完成的,但不需要您的程序在另一个符合标准的系统上执行相同的操作(甚至运行!)。 这是因为字段类型成对匹配( j
<==> i
, k
<===> j
, i
和<===> k
)。 如果将i
, j
和k
的类型更改为char
, double
和int
,则程序可能会打印一些垃圾值或崩溃。
从C99,6.2.7.1:
如果它们的标签和成员满足以下要求,则在单独的转换单元中声明的两种结构,联合或枚举类型是兼容的:如果一个声明有一个标签,则另一个声明有相同的标签。 如果两个都是完整类型,则以下附加要求适用: 在它们的成员之间应存在一对一的对应关系,以便每对对应的成员都声明为兼容的类型,并且如果一对对应的成员为用一个名称声明,另一个成员用相同的名称声明。 对于两个结构,相应的成员应以相同的顺序声明。 对于两个结构或联合,相应的位域应具有相同的宽度。 对于两个枚举,相应的成员应具有相同的值。 (强调)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.