繁体   English   中英

涉及链接的C程序获取奇怪的输出

[英]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 <==> ik <===> ji和<===> k )。 如果将ijk的类型更改为chardoubleint ,则程序可能会打印一些垃圾值或崩溃。

从C99,6.2.7.1:

如果它们的标签和成员满足以下要求,则在单独的转换单元中声明的两种结构,联合或枚举类型是兼容的:如果一个声明有一个标签,则另一个声明有相同的标签。 如果两个都是完整类型,则以下附加要求适用: 在它们的成员之间应存在一对一的对应关系,以便每对对应的成员都声明为兼容的类型,并且如果一对对应的成员为用一个名称声明,另一个成员用相同的名称声明。 对于两个结构,相应的成员应以相同的顺序声明。 对于两个结构或联合,相应的位域应具有相同的宽度。 对于两个枚举,相应的成员应具有相同的值。 (强调)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM