每次我尝试为字符串数组分配内存时,我的程序都会失败并显示错误消息“读取字符串字符时出错”。 我究竟做错了什么?我的内存分配有问题吗?
char** file2array(char *filename)
{
FILE *fp = fopen(filename, "r");
int i;
int max_line_len = 20;
int num_lines = 6;
char** lines = (char **) malloc(sizeof(char*) * (num_lines + 1));
fseek(fp, 0, SEEK_END);
int chars_num = ftell(fp);
rewind(fp);
for (i = 1; i < (num_lines + 1); i++) {
lines[i] = (char *) malloc(max_line_len + 1);
fgets(lines[i], chars_num, fp);
}
fclose(fp);
return lines;
}
答案 0 :(得分:1)
您似乎没有提供实际发出错误消息的代码,因此很难确定它在抱怨什么。但是,您的循环索引确实存在问题:
for (i = 1; i < (num_lines + 1); i++) {
lines[i] = /* ... */
变量i
从1
到num_lines
运行,从不取值0
,因此是动态指针数组中的第一个指针(索引为0
永远不会初始化。这是一个合理的解释,为什么一些后来的代码可能在阅读字符时遇到问题。
此外,您错误地使用fgets()
。你告诉它你的缓冲区长chars_num
字节,但它们实际上是max_line_len + 1
字节长。这表示缓冲区溢出的可能性。
确实,我不确定chars_num
应该是什么意思。您将其初始化为文件的长度(假设该长度适合int
),但我没有看到它是如何有用的。
此外,如果正在读取的文件的行数超过您所考虑的行数(20个字节,包括行终止符)或行数与您预期的不同(6),则您的函数可能会返回意外结果。
我没有看到你的内存分配存在任何固有的问题,但如果我没有给你一个强烈的舌头绑定来投射malloc()
的返回值,那么它就不会是StackOverflow。考虑自己被鞭打。