realloc误解

时间:2012-03-08 00:15:48

标签: c pointers realloc

有人可以向我解释为什么这段代码不起作用。我正在查看一些问题,但未能找到答案。可能是因为(巨大的)缺乏知识。

感谢您提供任何帮助。

char** sentence = malloc(min);
char* temp = malloc(min2);
int i = 0;

while(i<5)
{
    sentence = realloc(sentence, i+2);
    scanf("%s", temp);
    sentence[i] = malloc(strlen(temp));
    strcpy(sentence[i], temp);
    printf("%s\n", sentence[i]);
    i++;
}

4 个答案:

答案 0 :(得分:3)

您忘记了字符串具有空终止符的事实。

答案 1 :(得分:1)

sentence[i] = malloc(strlen(temp));

应该是:

sentence[i] = malloc(strlen(temp)+1);

对于字符串的长度(strlen AND ,您的空终止符也需要足够的空间。

答案 2 :(得分:0)

sentence = realloc(sentence, (i+1) * sizeof(*sentence));

会更有意义:您尝试存储i+1 char*,而不是i+2 字节

顺便说一句,您可以将malloc / strlen / strcpy替换为:

sentence[i] = strdup(temp);

(为你处理nul终结符)。

答案 3 :(得分:0)

sentence = realloc(sentence, i+2);

是一种常见的反模式。如果realloc返回NULL,那么你刚刚泄露了句子。相反,你需要写

temp = realloc(sentence, i+2);
if(temp == NULL)
  // out of memory - do something here
sentence = temp;

为了让生活变得更糟,你正在使用

  • 使用scanf是导致安全性错误的常见原因
  • 使用strcpy是导致安全性错误的常见原因
  • 没有检查你的mallocs的任何的结果,看它是否返回NULL(如果你没有得到写入访问冲突)
  • 在调用malloc之前不向strlen()添加+1,因此从strcpy获取1字节的堆溢出。
  • 使用while循环,其中for循环显然更合适。

除了这六个安全漏洞之外,你的表现还不错。