在使用结构之前,是否需要初始化结构的值?

时间:2011-09-29 22:41:33

标签: c struct dynamic-memory-allocation

我需要创建一个结构wordStruct的动态数组,它包含一个字符串及其在文本文件中出现的次数:

typedef struct wordStruct{
  char word[50];
  int count = 0;
}wordStruct;

我会从阅读文件中的单词数量中得到我需要的数字,我们称之为wordCount

struct wordStruct *wordList;
wordList = (wordStruct *)malloc(wordCount * sizeof(wordStruct));

这是为struct数组分配内存的正确方法吗? calloc()会更好吗?

int wordListIndex = 0;
char[50] inWord; // No word will be more than 49 characters + null terminator
for (i = 0; i < wordCount; i++){
  fscanf(data, "%s", inWord);
  for (j = 0; j < wordCount; j++){
    if (strcmp(wordList[j].word, inWord) == 0){
      wordList[j].count++;
      break;
    }
  }
  if (j == wordCount){
  strcpy(wordList[wordListIndex].word, inWord)
  wordListIndex++;
  }

我知道这可能不是最有效的代码,但我有正确的想法吗?我可以使用strcmp()方法,即使这些数组位置中可能没有任何数据吗?我是结构新手,我不确定我能做什么,不能做什么。

感谢。

2 个答案:

答案 0 :(得分:1)

如果您使用malloc,则需要初始化数组(例如,使用memset)。如果使用calloc,则数组会初始化为0。

初始化数组后,可以在其上使用strcmp,因为将其设置为0会使所有单词都为零长度(空)字符串。在初始化之前,您不能使用strcmp

(我假设在您的SO问题中,奇怪的char[50] varname而不是char varname[50]是拼写错误,否则这将无法编译。我也忽略了fscanf中的缓冲区溢出和strcpy ......从技术上讲,我想我不是。而且缺乏错误处理。)

答案 1 :(得分:0)

嵌套的for循环应该使用wordListIndex作为边界条件,最后的if块应该从内部for循环中取出。条件应该是

if (j == wordListIndex){
  strcpy(wordList[wordListIndex].word, inWord)
  wordListIndex++;
}