我正在使用Learn C the Hard Way在线书籍学习C,在练习17中,我遇到了一个令人困惑的错误。在练习中,我被告知使用malloc(sizeof(struct xxxx))为连接和数据库分配内存,如下所示:
struct Connection *conn = malloc(sizeof(struct Connection));
if(!conn) die("Memory error");
conn->db = malloc(sizeof(struct Database));
if(!conn->db) die("Memory error");
当我运行程序时,我得到一个Segmentation Fault,然后在valgrind下运行之后,我收到了这个错误:
==5770== Command: ./ex17 db.dat c
==5770==
==5770== Invalid read of size 1
==5770== at 0x40C4130: _IO_file_fopen@@GLIBC_2.1 (fileops.c:267)
==5770== by 0x40B88CA: __fopen_internal (iofopen.c:90)
==5770== by 0x40B893A: fopen@@GLIBC_2.1 (iofopen.c:103)
==5770== by 0x8048861: Database_open (ex17.c:58)
==5770== by 0x8048C4C: main (ex17.c:156)
==5770== Address 0x77 is not stack'd, malloc'd or (recently) free'd
main中的第156行只是通过函数struct Connection *conn = Database_open(filename, action);
创建一个新的连接结构,这似乎不是问题。跟随它到达Database_open中的第58行是conn->file = fopen(filename, 'w');
从错误的非堆栈,malloc'd部分,我假设上面的mallocs是问题。有人可以确认/帮我解决这个问题吗?
答案 0 :(得分:10)
您的问题是fopen
来电。 mode
应该是字符串,而不是char
。将模式更改为"r+"
或"w"
。
此外,编译并启用更多警告。