函数之间传递指向结构数组的指针



我有一个程序需要将一些文本逐字加载到数组中,因此我为

中定义的每个文本都有一个结构体

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返回时,它仍然是checkTextsmain中引用的旧的未初始化的地址,并且该地址的内存(可能)与以前一样,即未分配或为其他人保留。分割错误

相关内容

  • 没有找到相关文章

最新更新