2011-12-12 38 views
3

我有一個程序,它需要爲字一些文本字加載到一個數組,所以我有用於傳遞指向struct功能之間陣列

main.h定義的每個文本中的結構

typedef struct wordTag{ 
char name[MAX_WORD]; 
char string[1000][MAX_WORD]; 
int words; 
}text; 

的main.c

void main(){ 
    int fileCount = 0; 
    text *checkTexts; 
    fileCount = getCheckFiles(checkTexts); 

    for(i = 0; i < fileCount; i++){ 
    printf("Tekst navn: %s\n", checkTexts[i].name); 
    } 
} 

file.c

int getCheckFiles(text *checkTexts){ 

int fileCount, i; 

FILE *file; 

createFileList(&file); 
fileCount = countFiles(file); 

createArray(checkTexts, fileCount, file); 

return fileCount; 



} 

void createArray(text *checkTexts, int fileCount, FILE *file){ 
int i, wordCount; 
FILE *textFile; 
text localText; 
char fileName[MAX_WORD + 30]; 


checkTexts= (text *)malloc(fileCount * sizeof(text)); 

readFileNames(file, checkTexts); 

for(i = 0; i < fileCount; i++){ 
    localText = checkTexts[i]; 
    strcpy(fileName, "./testFolder/"); 
    strcat(fileName, localText.name); 
    openFile(&textFile, fileName); 

    localText.words = countWords(textFile); 

    readFileContent(textFile, localText); 
    checkTexts[i] = localText; 
} 

    for(i = 0; i < fileCount; i++){ 
    printf("Tekst navn: %s\n", checkTexts[i].name); 

    } 

} 

現在,如果我在createArray功能打印名稱每一件事工作正常,但如果我嘗試和打印在我的主要功能我得到一個分段錯誤(核心轉儲)。

+3

只是一個提示:瞭解'gdb',你永遠不會有詢問有關分段錯誤的錯誤的人......你可以自己跟蹤一下,看看究竟在何處的問題是... – mtahmed

回答

4

您還沒有初始化的checkTexts指針,您使用的是main()

在C(或C++)函數指針由傳遞不受參考(與例外,在C++中,當一個函數被聲明爲作爲參數的類型的引用的)。所以,當你調用getCheckFiles(checkTexts)不要緊什麼getCheckFiles()確實與傳入的參數 - 它不會改變main()checkTexts變量。

同樣的事情,然後在您的來電createArray()發生了。因此,儘管您在createArray()中創建了陣列,但是指向您malloc'd的緩衝區的指針永遠不會傳回呼叫鏈。

+0

感謝那些工作。 –

1

的問題是,內createArraymalloc通話不,你可能會心照不宣地假設,而是提供了一個新的指針到塊您提供的地址(checktexts)的內存塊關聯它保留的內存。您提供的checkTexts(內存地址)的值在createArray內被覆蓋; checkTexts也可能是一個局部變量。但是,當createArray返回時,它仍然是舊的checkTextsmain內引用的未初始化地址,並且該地址處的存儲器(可能)與以前一樣,即未分配或爲其他人保留。因此,分段錯誤