私はそれで要素を初期化して置くために動作するようにマップどのように構造体の動的配列にデータを格納するのですか?
typedef struct {
const char *name;
int number;
} Entry;
typedef struct {
int available;
int guard;
Entry *entries;
} Map;
とコードを実装したいと考えていると、これらの構造体があります。私は私のメインの方法
を実行したときにMap *map_init() {
Map *res = (Map *) malloc(sizeof(Map));
res->available = 4;
res->guard = 0;
res->entries = (Entry *) malloc(4 * sizeof(Entry));
return res;
}
int map_put(Map *map, const char *name, int nr) {
Entry entry;
int i = 0;
for (i = 0; i < map->guard; ++i) {
entry = map->entries[i];
printf("entry ( x , %u) at %p (%p)\n", entry.number, &entry, entry.name);
if (!strcmp(entry.name, name)) // Segmentation fault here
return 0;
}
entry = map->entries[map->guard++];
entry.name = name;
entry.number = nr;
printf("entry (%s, %u) at %p (%p)\n", entry.name, entry.number, &entry, entry.name);
return 1;
}
を
int main(int argc, char **argv) {
printf("Initialising...\n");
Map *map = map_init();
printf("Putting...\n");
map_put(map, "test", 2);
map_put(map, "some", 1);
// ...
free(map->entries);
free(map);
return 0;
}
出力として取得する
Initialising...
Putting...
entry (test, 2) at 0x7fff50b32a90 (0x10f0cdf77)
entry ( x , 0) at 0x7fff50b32a90 (0x5000000000000000)
Segmentation fault: 11
セグメンテーションフォールトは、entry.name
がもはや文字列を指していないという事実に由来しています(数字も失われますが、これは不正なメモリアクセスにつながりません)。私がmap_put
の最初の呼び出しでデータを設定すると、すべてが正しい場所に格納されているように見えます。
誰でも、これらのエントリが上書きされる可能性があり、値が保存されない理由は何ですか?
[mallocの結果のキャストに関するこのディスカッション](http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc)を読むことをお勧めします。 –