我有一个程序需要将一些文本逐字加载到数组中,因此我为
中定义的每个文本都有一个结构体main.h
typedef struct wordTag{
char name[MAX_WORD];
char string[1000][MAX_WORD];
int words;
}text;
c
void main(){
int fileCount = 0;
text *checkTexts;
fileCount = getCheckFiles(checkTexts);
for(i = 0; i < fileCount; i++){
printf("Tekst navn: %sn", 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: %sn", checkTexts[i].name);
}
}
现在,如果我在createArray函数中打印名称,一切都很好,但如果我尝试在我的主函数中打印,我会得到分割错误(核心转储)。
您还没有初始化您在main()
中使用的checkTexts
指针。
在C(或c++)中,函数指针是通过值传递的,而不是通过引用传递的(c++中例外的是,当函数声明以对类型的引用作为形参时)。所以当你调用getCheckFiles(checkTexts)
时,getCheckFiles()
对传入的参数做什么并不重要——它不会改变main()
的checkTexts
变量。
同样的事情发生在你对createArray()
的调用中。因此,尽管您在createArray()
中创建了数组,但指向您malloc的缓冲区的指针永远不会传播回调用链。
问题是createArray
中的malloc
调用并不像您默认的那样将内存块与您提供的地址(checktexts
)相关联,而是提供一个新的指针指向它保留的内存块。您提供的checkTexts
(内存地址)的值在createArray
中被覆盖;checkTexts
也可以是一个局部变量。然而,当createArray
返回时,它仍然是checkTexts
在main
中引用的旧的未初始化的地址,并且该地址的内存(可能)与以前一样,即未分配或为其他人保留。分割错误