C-在构造阵列上的realloc,索引时地址边界误差



我有一些代码,我正在尝试从文件中读取行,并在结构中存储一些信息。由于我不知道文件要长时间,因此我使用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 reallocn");
        *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 mallocn");
            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));
    }
}

相关内容

  • 没有找到相关文章

最新更新