以下是代码片段:
int main(void) {
char sizing[] = "manshcanshcnams cndhan sndhcna snshans";
char *xyz = malloc(sizeof(char));
printf("%ld\n",sizeof(xyz));
xyz = sizing; // IT SHOULD FAIL HERE
printf("Fail %s\n",xyz );
return 0;
}
正如您所看到的那样,我正在尝试为xyz分配更多内存,然后它可以容纳的内容。但输出不会失败。这是一个未定义的行为吗?
答案 0 :(得分:3)
您无法使用=
复制字符串。 xyz = sizing
只需修改变量xyz
,使其指向数组sizing
,而不是指向您所采用的内存。
所以,你的记忆已被泄露,但没有未定义的行为(除了你忘了包含<stdio.h>
和<stdlib.h>
)。
答案 1 :(得分:1)
您所做的只是告诉指针 xyz 指向与大小调整相关联的内存地址。没有理由这会失败。
答案 2 :(得分:-1)
我的理解是malloc()
不应该失败,除非它不能分配它所要求的内存量。但是,当您使用它时,您需要在不再需要它时释放该内存,否则您的程序将请求越来越多的内存,并且最终请求将失败,因为您没有什么都发布了。
此外,并非所有非法内存操作都会导致错误,例如(基于Kludas观察到的以前版本无法编译的代码编辑2013-03-08):
#include <stdio.h>
#include <string.h>
int main(void)
{
char myString[4];
strcpy(myString, "abcdefghijklmnopqrstuvwxyz"); /* This overflows the buffer */
/* but MIGHT NOT cause an */
/* immediate crash! */
printf("myString = [%s]\n", myString);
return 0;
}
这可能或者可能不会触发错误,但它肯定是非法的,因为我将26个字符写入一个只能容纳4个项目的数组(三个字符加一个终止NULL)。