http://c.learncodethehardway.org/を使用してCを学習しようとしていますが、第18章(http://c.learncodethehardway.org/book/learn-c- the-hard-waych18.html)そして私は誰かが私を助けてくれることを望んでいます。
私が抱えている特定の問題は、次のように定義された構造体がいくつかあることです。
#define MAX_ROWS = 500;
#define MAX_DATA = 512;
struct Address {
int id;
int set;
char name[MAX_DATA];
char email[MAX_DATA];
};
struct Database {
struct Address rows[MAX_ROWS];
};
struct Connection {
FILE *file;
struct Database *db;
};
rows
課題は、その定数に依存しない可変サイズを持つことができるようにそれを作り直すことです。
rows
したがって、Database_createメソッドでは、次のように初期化しようとしています。
conn->db->rows = (struct Address*) malloc(max_rows * sizeof(struct Address));
ここでconn->db
、データベースのインスタンスを指しmax_rows
、関数に渡されるintです。また、データベース構造体を次のように変更しました
struct Database{
struct Address* rows;
}
そのコードは問題なく動作しているように見えますが、メンバーのいずれかにアクセスしようとするとrows
、使用されていないメモリのビットにアクセスしようとしていることを意味すると思われるセグメンテーション違反が発生します。
私はこれにかなりの時間を費やしました、そして私はあまり遠くに行くことができないと確信しています、しかし私は私を正しい軌道に乗せるためのどんなガイダンスにも本当に感謝します。
編集:Valgrindで実行した後、これにもう少し詳細を追加したかっただけで、エラーが発生します:
==11972== Invalid read of size 4
==11972== at 0x100001578: Database_set (ex18.c:107)
==11972== by 0x100001A2F: main (ex18.c:175)
==11972== Address 0x7febac00140c is not stack'd, malloc'd or (recently) free'd
それが指すコード行は次のとおりです。
struct Address *addr = &conn->db->rows[id];
if(addr->set) die("Already set, delete it first");
107行目は、if(addr->set)
読めないものを読み込もうとしていることを意味していると思います。