簡體   English   中英

如何從函數中獲取指針的指針

[英]How to get back pointer of pointers from a function

我有一個打開文件的功能,逐行讀取其內容,然后將其推入數組。 我設法在正確的函數中獲取了數組函數,但是當我想將其返回到主函數中時,我無法獲取數組中的任何項目。

一些代碼將幫助您理解:

我的主要功能:

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

我怎樣才能解決這個問題 ?

很難確切說明會發生什么,因為代碼中存在幾個小問題(可能會導致此問題),請嘗試通過以下方式更改代碼:

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

不太確定這是整個問題,但已發布代碼:

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()聲明為“ true”。

建議:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM