gpt4 book ai didi

c - 在结构数组上重新分配,索引时地址边界错误

转载 作者:行者123 更新时间:2023-12-01 14:11:01 25 4
gpt4 key购买 nike

我有一些代码试图从文件中读取行并将每一行的一些信息存储在结构中。由于我不知道文件的长度,我正在使用 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 (真实文件有几千行)。

最佳答案

当您执行 *array=tmp 时,您正在为数组[0] 分配内存

那么你正在使用数组[i],它应该是一个指向缓冲区的指针,但指向垃圾或 0

您混淆了两种使用数据的方式。

第一种是使用数组——非动态的:

buffer array[x] = {0};
int num = read_into_array(filename, &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));
}
}

关于c - 在结构数组上重新分配,索引时地址边界错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46421213/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com