指针未分配

时间:2014-02-18 19:06:27

标签: c

我正在做的就是在c(char * )中启动一个双指针来保存我的字符串数组。我将此变量(char * array_strings)传递给另一个函数,该函数应该打开一个文件并创建一个表示文件每一行的字符串数组,但由于某种原因,当我从函数返回时,变量array_strings为null。

int main(void) {
    char **array_strings;
    char *book_file = "book.txt";
    delimitByNewline(book_file, array_strings);
    return 1;
}

//delimit file

void delimitByNewline(char *book, char **array) {
    int count = 0;
    int i = 0;
    char c;
    int size = fileLines(book);
    srand(time(NULL));
    char **ret_array = (char **)malloc(sizeof(char *) * size);

    FILE *bk = fopen(book, "rt");
    if(!bk) {
        perror("fp");
        exit(1);
    }

    char *line = (char *)malloc(sizeof(char)*60);

    while ((c = fgetc(bk)) != EOF) {
        line[i] = c;
        i++;
        if(c == '\n') {
            ret_array[count] = line;
            line = (char *)malloc(sizeof(char) * i);
            count++;
            i = 0;
        }

    }

    fclose(bk);
    array = ret_array;
    free(line);
    free(ret_array);
}

2 个答案:

答案 0 :(得分:4)

由于您要在函数中分配集合,因此需要将其返回给调用者。

我建议将退货签名从void更改为char **并将流程更改为:

char** delimitByNewline(char* book){
   char** ret_array = (char **)malloc(sizeof(char *)*size);
   // .. assign the strings, don't free!
   return ret_array;
}

并且如此调用:

char* book_file = "book.txt";
char** array_strings = delimitByNewline(book_file);

(请注意@ JonathanLeffler的评论 - 堆分配ret_array的所有权传回给来电者 - 即来电者必须free,而不是delimitByNewLine()。!)

修改

如果你真的想把数组作为out参数传递,你需要传递原始指针的地址,因为函数需要它来分配malloc ed数组的地址,即:

char **array_strings = 0; // NULL
char *book_file = "book.txt";
delimitByNewline(book_file, &array_strings);
// do stuff
// free strings + array

然后需要取消引用它来分配它。

void delimitByNewline(char *book, char ***array) {
    *array = (char **)malloc(sizeof(char *) * size);
    // ... Don't free

答案 1 :(得分:1)

在函数void delimitByNewline(char* book,char** array)中,参数类型不正确。您正在传递地址并写入char *&的类型char **

FILE *bk = fopen(book,"rt");文件访问模式中的t是什么?