我有两个翻译单元..
file1.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;
}
file2.c中
char a[4]={'Q','u','i','r'};
通过项目的编译和链接没有错误,但是当我对程序进行了优化时,它会给出分段错误错误(在调试模式下)。 我认为链接器如何解决file1.c中标识符a的错误链接以定义文件2中的错误链接,这种情况发生在我也改变了file2.c的数据类型(a的定义)如何可能,链接器用于链接相同或不同转换单元中的标识符的机制是什么?
答案 0 :(得分:0)
您收到了细分错误,因为您已定义char a[4]
并且您已extern char a[90]
您还需要使用-Wall
启用警告,在链接步骤中,编译器会识别此变量,因此您不会收到任何错误。
答案 1 :(得分:0)
您可以在file1.c
extern char a[];
然后在file2.c
char a[4]={'Q','u','i','r'};
这意味着同一个数组对象最初可能具有不完整的类型,但稍后会获得完整的类型。当然,这并不意味着您可以将a声明为int
,然后将其定义为double
。你在这里唯一与类型相关的自由是完成一个不完整的类型。没有了。
礼貌:Shouldn't declaration match its definition when array is involved?
但是,您可能希望避免连接到未知长度的char
数组。