0

私は2つの翻訳単位を持っています..

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 の間違ったリンクを file2.c の定義 a に解決する方法があると思います。同じまたは異なる翻訳単位で識別子をリンクするためにリンカーが使用するメカニズムは何ですか?

4

2 に答える 2

0

次のように、不完全型のオブジェクトを宣言できます。file1.c

extern char a[];

次に、完全な型で定義しますfile2.c

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

これは、同じ配列オブジェクトが最初は不完全な型を持つことができますが、後で完全な型を取得できることを意味します。もちろん、これは a を として宣言し、intそれを として定義できるという意味ではありませんdouble。ここでも、型に関する唯一の自由は、不完全な型を完成させることです。もういや。

礼儀:配列が含まれる場合、宣言はその定義と一致するべきではありませんか?

charただし、長さが不明な配列への連結は避けたい場合があります。

于 2013-09-13T10:06:43.270 に答える