我对如何正确分配内存感到困惑。我试图从文本文件中列出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]);
}
答案 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]
分配内存