在函数之间传递指向struct数组的指针

时间:2011-12-12 00:51:56

标签: c function pointers 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函数中打印名称,那么每件事情都可以正常工作,但如果我尝试在主函数中打印,我会遇到分段错误(核心转储)。

2 个答案:

答案 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返回时,它仍然是checkTextsmain内引用的未初始化地址,并且该地址的内存(可能)就像它是在之前,即未分配或保留给其他人。所以,分段错误