我有一个函数可以打开一个文件,逐行读取它的内容,然后将其推送到一个数组中我已经设法把数组函数放在正确的函数中,但是当我想把它放回我的主函数时,我不能得到数组的任何项。
一些代码将帮助您理解:
我的主要功能:

/* ----------------- MAIN ------------ */
int main(int argc, char *argv[]) {

    /*... some useless code for now ... */

    char **ptrLines = NULL;
    ptrLines = readEventFile(ptrParam, ptrLines);
    outputExecTrace(WAR, "PTRLINES x : %x", ptrLines);
    outputExecTrace(WAR, "PTRLINES char[] : %s", *(ptrLines + 2));

    return EXIT_SUCCESS;
}

我的文件读取器函数:
char** readEventFile(Parameters *parameters, char **arrLine) {

    FILE *fp = fopen(parameters->inputFilePath, "r");
    if (fp == NULL)
        exit(0);

    char line[128];
    int nbCharOfLine = 0;
    while(1) {
        fgets(line, sizeof(line), fp);
        if (feof(fp))
            break;

        nbCharOfLine++;
    }

    fclose(fp);
    arrLine = malloc(sizeof(line) * nbCharOfLine);
    nbCharOfLine = 0;
    fp = fopen(parameters->inputFilePath, "r");
    while(1) {
        fgets(line, sizeof(line), fp);
        if (line[0] != '#') {
            arrLine[nbCharOfLine] = malloc((strlen(line)+1) * sizeof(char));
            strcpy(arrLine[nbCharOfLine], line);
            nbCharOfLine++;
        }
        if (feof(fp))
            break;
    }

    fclose(fp);
    outputExecTrace(WAR, "ARRLINE x : %x", arrLine);
    outputExecTrace(WAR, "ARRLINE char[] : %s", *(arrLine + 2));

    return arrLine;
}

是的,我的输出如下:
WARNING: ARRLINE int : -2020552688
WARNING: ARRLINE char[] : 1 3 4 //This is the result I am looking for.

WARNING: PTRLINES int : -2020552688 // Same as ARRLINE
Segmentation fault (core dumped) // And this is because ptrLines[2] doesn't contains anything... but why ?!

我该怎么解决?

最佳答案

很难确切地说出发生了什么,因为代码中有几个小问题,可能会导致这种情况,请尝试以下方式更改代码:

char** readEventFile(char* fileName) {
    char line[128];
    int nbCharOfLine = 0;

    FILE *fp = fopen(fileName, "r");
    if (fp == NULL)
        exit(1);
    while (!feof(fp)) {
        char *r = fgets(line, sizeof(line), fp); // NOTE: proper handling of fgets return value
        if ((r != NULL) && (line[0] != '#'))
            nbCharOfLine++;
    }
    fclose(fp);

    char **arrLine = calloc(nbCharOfLine, sizeof(char*)); // use calloc to be sure
    nbCharOfLine = 0;

    fp = fopen(fileName, "r");
    while (!feof(fp)) {
        char *r = fgets(line, sizeof(line), fp);
        if ((r != NULL) && (line[0] != '#')) {
            arrLine[nbCharOfLine] = calloc(strlen(line) + 1, sizeof(char));
            strcpy(arrLine[nbCharOfLine++], line);
        }
    }
    fclose(fp);

    return arrLine;
}

在main中,您将调用此函数,如下所示:
char **ptrLines = readEventFile(ptrParam->inputFilePath);

07-24 09:44
查看更多