我有一个程序需要将一些单词加载到一个数组中,所以我有一个结构为
中定义的每个文本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函数中打印名称,那么每件事情都可以正常工作,但如果我尝试在主函数中打印,我会遇到分段错误(核心转储)。
答案 0 :(得分:4)
您尚未初始化checkTexts
中使用的main()
指针。
在C(或C ++)中,函数指针由值传递,而不是由引用传递(在C ++中,当声明函数引用引用时除外)作为参数的类型)。因此,当您致电getCheckFiles(checkTexts)
时,getCheckFiles()
对传入参数的作用无关紧要 - 它不会更改main()
的{{1}}变量。
同样的事情发生在您对checkTexts
的调用中。因此,尽管在createArray()
中创建了数组,但是指向malloc的缓冲区的指针永远不会传播回调用链。
答案 1 :(得分:1)
问题是malloc
内的createArray
调用并未将内存块与您提供的地址(checktexts
)相关联,因为您可能默认假设它提供了一个 new 指针,指向它保留的内存块。您提供的checkTexts
(内存地址)的值将在createArray
内被覆盖; checkTexts
也可能是一个局部变量。但是当createArray
返回时,它仍然是旧,checkTexts
在main
内引用的未初始化地址,并且该地址的内存(可能)就像它是在之前,即未分配或保留给其他人。所以,分段错误