簡體   English   中英

segmentation fault從函數返回一個字符串數組

[英]segmentation fault return a string array from a function

我創建了一個函數,創建一個動態字符串數組,動態字符串長度然后我將它返回到我的主函數。 在我的函數中一切正常但是當我嘗試在main中打印數組時,我在第4個字符串之后得到了一個分段錯誤 - 前兩個字符串也沒有正確打印出來。 程序的這一部分應該找出目錄及其子目錄中的所有條目並將它們存儲在主存儲器中。

這是結果:

Path[0]=A/New Folder. - i=0
Path[1]=A/atext - i=1
Path[2]=A/a - i=2
Path[3]=A/alink - i=3
Path[4]=A/afolder - i=4
Path[5]=A/afolder/set008.pdf - i=0
Path[6]=A/afolder/anotherfolder - i=1
Path[7]=A/afolder/anotherfolder/folderOfAnotherFolder - i=0
Path[8]=A/afolder/anotherfolder/folderOfAnotherFolder/mytext - i=0
Path[9]=A/afolder/anotherfolder/mytext - i=1
Path[10]=A/afolder/set001.pdf - i=2
Entries in directory: A
��
��
A/a
A/alink
Segmentation fault

這是代碼:功能:

char ** getDirContents(char *dirName,char **paths ) 
{   
    DIR * tmpDir;
    struct dirent * entry;
    //char  tmpName[512];
    char * tmpName=NULL;
    struct stat node;
    int size=0;
    int i=0;
    //paths=NULL;

    if((tmpDir=opendir(dirName))==NULL){
        perror("getDirContents opendir"); 
        return NULL;
    }
    i=0;
    while ((entry=readdir(tmpDir))!=NULL) 
    {
        //if (entry->d_ino==0) continue;
        if(strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0)//Ignore root & parent directories
            continue;but I

        tmpName =(char *)malloc(strlen(dirName)+strlen(entry->d_name)+2);
        strcpy(tmpName,dirName);
        strcat(tmpName,"/");
        strcat(tmpName,entry->d_name);
        //printf("\ntmpName[%d]:%s",count,tmpName);

        paths=(char**)realloc(paths,sizeof(char*)*(count+1));
        paths[count]=NULL;
        //paths[count]=(char*)realloc(paths[count],strlen(tmpName)+1);
        paths[count]=(char*)malloc(strlen(tmpName)+1);

        //memcpy(paths[count],tmpName,strlen(tmpName)+1);
        strcpy(paths[count],tmpName);
        printf("\nPath[%d]=%s - i=%d",count,paths[count],i);

        count++;

        if(lstat(tmpName,&node)<0)    
            { 
                printf("\ntmpName:%s",tmpName);
                perror("getDirContents Stat");
                exit(0);
            }
        if (S_ISDIR(node.st_mode))
            {
                getDirContents(tmpName,paths);//Subfolder
            }

        //printf("\n%s,iters:%d",tmpName,i);
        free(tmpName);
        tmpName=NULL;
        i++;
    }
close(tmpDir);
return(paths);
}

主要:

char **A=NULL;
count=0;
A=getDirContents(dir1,NULL);
Aentries=count;
count=0;
//B=getDirContents(dir2,NULL);
printf("\nEntries in directory: %s",dir1);
for(i=0;i<Aentries;i++)
{
     printf("\n%s",A[i]);
}

count是一個全局變量

我只是無法弄清楚出了什么問題我認為我正確地使用了return命令。 我也嘗試使用路徑作為全局變量的相同代碼,它工作正常(主打印出正確的結果)。 我覺得它與我的函數的遞歸調用有關

您的問題是, 根據標准,您的realloc調用可能(並且可能會)返回指向與原始內存位置不同的內存位置的指針

這是一個棘手的問題,它有點難以解釋和想象,但我會盡我所能。

當你最初調用你的函數時,它會創建一個新的堆棧幀(讓我們稱之為A )。 它分配一個地址的paths (比如0x01 ),用它做一些東西,然后函數以paths地址作為參數遞歸地調用它自己。

當您遞歸調用你的函數,它會創建一個新的堆棧幀(我們稱之為B ),在您reallocpaths指針-這改變了從地址0x010x02 -做一些東西吧,然后返回。

但是當B返回時, Apaths指針仍然指向舊位置0x01 ,即使它已經無效並且已經移動到0x02

解決方案很簡單, 確保在遞歸調用結束時將paths指向新位置 所以代替:

getDirContents(tmpName,paths); //Subfolder

......你做的:

paths = getDirContents(tmpName,paths); //Subfolder

另外,請確保檢查reallocmalloc的返回值(反對NULL ),並且不要malloc的返回值

您的代碼具有未定義的行為

您將該函數稱為:

A=getDirContents(dir1,NULL);

並且該功能定義為:

char ** getDirContents(char *dirName,char **paths ) 

此外,您在paths上調用realloc

paths=(char**)realloc(paths,sizeof(char*)*(count+1));

這會導致未定義的行為。

標准要求傳遞給realloc的指針應該與使用內存管理功能分配動態內存的指針完全匹配。 標准指定的內存管理函數有: aligned_alloccallocmallocrealloc

您傳遞給realloc()的指針( paths )未被任何這些指針( paths )返回,因此未返回未定義的行為。

暫無
暫無

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

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