1

我正在尝试将一组行从文件读取到数组。我这样做是为了学习 malloc 和 realloc。

#define MAX_LINE 301

char** read_file_lines(char* filename) {
    char** ptr = NULL;
    int max = 5;
    int i = 0;
    FILE *fp = fopen(filename, "r");

    if(fp != NULL) {
        char line[MAX_LINE];
        while(fgets(line, MAX_LINE, fp) != NULL) {

            /* allocate some extra memory for some more lines */
            if(i == max) {
                int new_max = max * 2;
                int nr_bytes = new_max * sizeof(char) * MAX_LINE;
                char **ptr2 = realloc(ptr, nr_bytes);
                if(ptr2 != NULL) {
                    ptr = ptr2;
                    ptr2 = NULL;
                    max = new_max;
                }
            }

            // ptr[i] = line;
            // strcpy(ptr[i], line);
            memcpy(ptr[i], line, strlen(line));
            i++;
        }
        fclose(fp);
    }
    else {
        printf("Error opening file %s\n", filename);
    }

    return ptr;
}

代码编译。但是,当它执行时,会发生错误(程序崩溃)。

我做了一些调试,并确定问题出在memcpy ()指令中。我以前尝试过 using strcpy,这也给出了类似的问题。

我去查看了memcpy()的protocol,如下:

void * memcpy ( void * destination, const void * source, size_t num );

现在, if ptris char**, 不ptr[i]等于 a char*?

感谢您的意见。

4

3 回答 3

3

看起来ptr根本没有初始化为指向任何内存。此外,您没有为各个行分配任何内存。

要初始化ptr,请将声明更改为:

int max = 5;
char** ptr = malloc(max * sizeof(char*));

尝试在调用 memcpy 之前添加它:

        ptr[i] = malloc(strlen(line) + 1);

并更改呼叫的计算realloc

            int nr_bytes = new_max * sizeof(char*);

编辑:更详细地解释:ptr是指向指针数组的指针。您必须为ptr(即,足够的内存仅用于存储单个指针)分配内存。除此之外,您还必须分配各个元素ptr将指向的每个单独的字符数组。

我建议的第一个更改确保ptr始终指向足够的内存来容纳 5 个指针(或更多,一旦它被重新分配。)

第二个更改确保 的每个成员ptr在您尝试将其作为指针访问之前始终指向有效内存。

第三个更改是必需的,因为ptr指向的元素是指向 的指针char而不是char.

于 2013-05-06T20:07:12.393 回答
1

问题是在第一次执行内存没有分配:i为 0,max为 5,if条件为假并且realloc永远不会执行。

于 2013-05-06T20:06:15.940 回答
1

不。数组不是指针。指向指针的指针不是数组的数组。如果您想要一个二维动态数组,那么您必须为 1. 指向各个行的指针数组分配内存,以及 2. 也为行本身分配内存。

于 2013-05-06T20:06:54.147 回答