在马洛克的Strlen

时间:2012-03-13 12:58:46

标签: c pointers

为什么这不会返回警告?这段代码应该是什么问题?

char *str = malloc(strlen("hello" + 1));
strcpy(str, "hello");

谢谢!

3 个答案:

答案 0 :(得分:8)

为什么会发出警告?

代码被破坏是因为您应该strlen("hello") + 1,而不是strlen("hello" + 1)(相当于strlen("ello"))。

答案 1 :(得分:6)

char *str = malloc(strlen("hello" + 1));
strcpy(str, "hello");

几乎相当于:

char *temp = "hello";
char *temp2 = temp + 1;

char *str = malloc(strlen(temp2));
strcpy(str, "hello");

所以temp + 1是指针数学(它返回一个指向ello的指针,strcpy不检查目的地是否有足够的内存(“标准”内存损坏是由错误引起的C)中的代码

最终结果是strlen返回4,strcpy使用6个字节的内存,并且随机堆的一堆被删除。

答案 2 :(得分:1)

以下声明不正确。

char *str = malloc(strlen("hello" + 1)); 

应该是

char *str = malloc(strlen("hello") + 1);
在这种情况下,strlen可能会返回值4而不是5,strcpy将导致Out of Bounds写入。使用内存分析器执行程序,它应指出错误。