静的に定義された構造体の配列をリンクしようとしています。そのために extern 修飾子を使用しています。extern 構造体のメモリ アドレスを出力すると、実行可能ファイルにあるように見える場所とは異なります。
ここに私が持っているものがあります:
タイプ.h:
typedef struct tableEntry {
const char *my_str;
void *my_addr;
int myint;
} my_struct;
test.c:
include "type.h"
my_struct my_array[] = {
{"hello", (void*)15, 5000},
{"world", (void*)15, 3000},
{"abtest", (void*)15, 2000},
};
main.c:
#include <stdio.h>
#include "type.h"
extern my_struct* my_array;
int main() {
printf("array location - %p\n", my_array);
printf("array entry 1 myint - %d\n", my_array[0].myint);
printf("array entry 1 address - %p\n", my_array[0].my_addr);
printf("array string location - %p\n", &(my_array[0].my_str));
printf("array string - %s\n", my_array[0].my_str);
}
次のようにプログラムをコンパイルします。
gcc test.c main.c
実行可能ファイルを実行すると、次の出力が得られます。
array location - 0x4006be
array entry 1 myint - 29811
array entry 1 address - 0x6574626100646c72
array string location - 0x4006be
Segmentation fault (core dumped)
nm 出力での my_array のアドレス:
0000000000601060 D my_array
ご覧のとおり、私の出力は期待したものではなく、my_array が適切にリンクされていません (nm 出力の場所は、実際のプログラムによって出力される場所とは異なります)。
注: test.c ファイルを main.c に含めることはできません。リンクする必要があります。