我有一些代码,我试图从文件中读取行并从结构中的每一行存储一些信息。由于我不知道文件的长度,我会使用realloc
动态调整结构数组。
我的问题是我的代码似乎适用于前3行(技术上为6行),然后我收到SIGSEGV(地址边界错误)。 gdb
表示在尝试索引数组(array[i]->string = (char*) _tmp
)时会发生这种情况。
typedef struct {
char* string;
int len;
} buffer;
int read_into_array(char *filename, buffer** array) {
int n;
size_t size;
char* buf = NULL;
FILE *file = fopen(filename, "r");
int i = 0;
while (1) {
buffer *tmp = (buffer*)realloc(*array, sizeof(buffer) * (i + 1));
if (!tmp)
printf("Failed realloc\n");
*array = tmp;
// First line is ignored, second line is taken as data.
getline(&buf, &size, file);
n = getline(&buf, &size, file);
if (n > 0) {
void* _tmp = malloc(sizeof(char) * n);
if (!_tmp)
printf("Failed malloc\n");
array[i]->string = (char*) _tmp;
array[i]->len = n-1;
strncpy(array[i]->string, buf, n-1);
}
i++;
if (feof(file)) {
printf("saw end of file, leaving.\n");
break;
}
}
return i;
}
int main(int argc, char* argv[]) {
char *filename = argv[1];
buffer *array = (buffer*) calloc(1, sizeof(buffer));
int num = read_into_array(filename, &array);
}
对于格式有点差的道歉,我一直试图解决这个问题。
由于它似乎适用于前几行,我的假设是我在realloc
计算中的某处出错了。我的另一个猜测是,我以某种方式错误地使用/读取文件。
感谢您的帮助。对于后代,该文件看起来像这样https://hastebin.com/vinidiyita.sm(真正的文件长达数千行)。
答案 0 :(得分:0)
当你执行* array = tmp时,你正在为数组[0]
分配内存然后你使用的数组[i]应该是指向缓冲区的指针,但指向垃圾或0
你混淆了两种使用数据的方式。
首先是使用数组 - 这是非动态的:
buffer array[x] = {0};
int num = read_into_array(filename, &array);
然后你可以使用array [i]
并且有动态类型:
buffer **array = calloc(initial_len*sizeof(buffer *));
int num = read_into_array(filename, array, initial_len);
read_into_array(char *filename, buffer **&array, int initial_len)
{
int len = initial_len;
...
while()
{
...
if(i>len)
{
array = realloc(array, sizeof(buffer*) * (i + 1));
len = i;
}
array[i] = calloc(sizeof(buffer));
}
}