【问题标题】:Allocate a string array from inside a function in C从 C 中的函数内部分配字符串数组
【发布时间】:2011-09-26 18:19:06
【问题描述】:

我有一个函数可以扫描文件并返回行数以及字符串数组中的行数,我的函数如下所示:

int load_lines(char* _file, char** _array){
    FILE *infile;
    char line_buffer[BUFSIZ];
    char line_number;

    infile = fopen(_file, "r");

    ine_number = 0;
    while (fgets(line_buffer, sizeof(line_buffer), infile)) 
        ++line_number;

    fclose(infile);
    _array = malloc (line_number * sizeof(char*));
    infile = fopen(_file, "r");
    line_number = 0;

    while (fgets(line_buffer, sizeof(line_buffer), infile)) {
        _array[line_number] = malloc(strlen(line_buffer) + 1);
        strcpy(_array[line_number], line_buffer);

        //a printf on _array[line_number] works fine here
        ++line_number;
    }

    return line_number;
}

当我这样称呼它时:

char** _array;
line_number = load_lines(inname, _array);

_array[0];

我得到一个分段错误,因为在函数返回后似乎没有分配数组。

【问题讨论】:

  • 您是否尝试过在调试器中单步执行您的代码?

标签: c memory-management segmentation-fault


【解决方案1】:

当您将参数传递给函数时,函数总是处理该参数的副本。

所以在你的情况下,load_lines 正在处理_array 的副本。原_array没有修改:

char** _array = NULL;
printf("%p\n", _array); // Prints "0x0000"
line_number = load_lines(inname, _array);
printf("%p\n", _array); // Prints "0x0000"

要修改_array,需要传递一个指向它的指针:

int load_lines(char* _file, char*** _array){
    ...
    (*array) = malloc (line_number * sizeof(char*));
    ...
    (*array)[line_number] = malloc(strlen(line_buffer) + 1);
}

char** _array = NULL;
line_number = load_lines(inname, &_array);

[然而,任何时候你发现自己需要一个三重指针(即***),是时候重新考虑你的架构了。]

【讨论】:

  • 没错,我想知道在 C 中是如何处理事情的,这是一个返回从文件中读取的行及其编号的函数!
【解决方案2】:

如果你想从函数返回一个新分配的字符串数组,那么函数的第二个参数的类型必须是char***,例如。指向字符串数组的指针:

int load_lines(char* _file, char*** _array) {
    ...
    char** tmparray = malloc(line_number * sizeof(char*));
    ...
        tmparray[line_number] = malloc(strlen(line_buffer) + 1);
        strcpy(tmparray[line_number], line_buffer);
    ...
    (*_array) = tmparray;
}

当你调用函数时:

char** _array;
line_number = load_hosts(inname, &_array);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 2021-08-31
    • 2017-01-31
    相关资源
    最近更新 更多