为什么这不会返回警告?这段代码应该是什么问题?
char *str = malloc(strlen("hello" + 1));
strcpy(str, "hello");
谢谢!
答案 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写入。使用内存分析器执行程序,它应指出错误。