C - char *列表 - 内存分配

时间:2014-08-10 05:01:21

标签: c memory char

我对如何正确分配内存感到困惑。我试图从文本文件中列出char *的列表。每次我做一个char *我必须为它分配内存吗?何时何地例外?

#define BUFF 1000   

 int main(int argc, char** argv)
 {
  FILE* file;
    file = fopen(argv[1], "r");
    char* word = calloc(BUFF, sizeof(char));
    char* sentence = calloc(BUFF, sizeof(char));
    char** list = calloc(BUFF, sizeof(char*));
    int i = 0;
while((fgets(sentence, BUFF, file)) != NULL)
{
  word = strtok(sentence, " ,/.");
  while(word != NULL)
  { 
    printf("%s\n", word);
    strcpy(list[i],  word);
    i++;
    word = strtok(NULL, " ,/.");
  } 
}
int k;
for(k = 0; k < i; k++)
{
 puts("segging here");
 printf("%s\n", list[i]);
}

3 个答案:

答案 0 :(得分:3)

规则是:您必须分配您使用的任何内存。

你的问题来了:

strcpy(list[i],  word);

list[i]当前没有指向任何已分配的存储(它可能是一个空指针)。在将字符复制到其中之前,您必须将其指向某处。

一种方法是:

list[i] = strdup(word);

strdup不是ISO C标准函数,但它等同于malloc然后strcpy。之后你需要free

此外,i++行需要在i == BUFF时停止,并且将\n添加到strtok分隔符列表中非常有用。

答案 1 :(得分:0)

除了Matt McNabb的答案之外,使用strtok还有一个更微妙的问题。该函数不需要输出缓冲区;它只返回一个指向输入缓冲区内某处的指针。

当您调用char* word = calloc(BUFF, sizeof(char));时,您将分配内存并指定word以指向已分配的内存。然后,当您致电word = strtok(sentence, " ,/.");时,您会覆盖word的值。这意味着您的控件中没有指针指向您已分配的内存。该内存对您的代码不再有用,您无法释放它;它已被泄露。

您可以通过编写char* word = strtok(sentence, " ,/.");来解决此问题然后,由于您没有分配word指向的内存,请记住不要free

答案 2 :(得分:0)

您的list是一个char *列表,其大小为BUFF,但list[i]是什么? 你没有为它分配内存。

您需要在循环中为list[i]分配内存