0

我有两个翻译单位..

文件1.c

#include<stdio.h>
#include<string.h>
extern char a[90];

int main(int argc,char ** argv){


//printf("%s ",a);

strcat(a,"y Code");
printf("%s",a);
return 0;
}

文件2.c

char a[4]={'Q','u','i','r'};

通过项目的编译和链接没有错误但是当我执行程序时它给出了分段错误错误(在调试模式下)。我认为链接器如何将file1.c中的标识符a的错误链接解析为file2.c中的定义a,当我还更改file2.c中a的数据类型时会发生这种情况(a的定义)怎么可能,链接器使用什么机制来链接相同或不同翻译单元中的标识符?

4

2 回答 2

0

你得到一个分段错误,因为你已经定义char a[4]并且你有extern char a[90]

您还需要使用-Wall, 在链接步骤编译器识别此变量期间启用警告,因此您不会收到错误。

于 2013-09-13T10:02:54.380 回答
0

您可以声明不完整类型的对象,如file1.c

extern char a[];

然后用完整的类型定义它file2.c

char a[4]={'Q','u','i','r'};

这意味着相同的数组对象最初可以具有不完整的类型,但稍后会获得完整的类型。当然,这并不意味着您可以将 a 声明为 anint然后将其定义为 a double。同样,您在这里拥有的唯一与类型相关的自由是完成一个不完整的类型。不再。

礼貌:当涉及数组时,声明不应该与其定义匹配吗?

但是,您可能希望避免连接到char未知长度的数组。

于 2013-09-13T10:06:43.270 回答