如何从函数中获取指针指针

时间:2015-04-28 16:07:19

标签: c arrays pointers

我有一个打开文件的功能,逐行读取其内容然后将其推送到数组。我已经设法在正确的函数中获取数组函数,但是当我想将它返回到我的main函数时,我无法得到我的数组中的任何项目。

有些代码可以帮助您理解:

我的主要职能:

/* ----------------- 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;
}

我的fileReader功能:

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 ?!

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

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

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;
}

在您的主要内容中,您将调用此函数,如:

char **ptrLines = readEventFile(ptrParam->inputFilePath);

答案 1 :(得分:0)

不太确定这是整个问题,但是发布的代码:

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;
}
由于多种原因,

不是正确的方法, 包括那个函数feof() 只是声称是真的'当代码试图读过去的时候 文件的结尾。

建议:

while( fgets(line, sizeof(line), fp) )
{
    if (line[0] != '#') 
    {
        if( NULL == (arrLine[nbCharOfLine] = malloc((strlen(line)+1) * sizeof(char)) ) )
        { // then, malloc failed
            perror( "malloc failed" );
            // close file and free all malloc'd areas
            exit( EXIT_FAILURE );
        }

        // implied else, malloc successful

        strcpy(arrLine[nbCharOfLine], line);
        nbCharOfLine++;
    }
}