我是 C 语言的新手。我试图确保自己理解动态内存分配,所以我自己想出了一些例子。当我偶然发现这个时,我不确定为什么会崩溃。也就是说,我看不到我们违反了什么。也许这里的一位高级 C 程序员可以向我解释。我们可以在将字符串指向某处后不对其进行操作吗?提前致谢。
int main(){
char *name = (char*)malloc(sizeof(char)*10);
name = "Hello";
name[0] = 'X'; //<------ bad idea?
puts(name);
free(name);
char aname[sizeof(char)*10] = "Hello";
aname[0] = 'X';
puts(aname);
return 0;
}
最佳答案
因为一切都是错的。
首先,don't cast the return value of malloc()
in C .也不要通过 sizeof(char)
缩放字符分配,这只是输入 1
的一种复杂方式,当然 x * 1
仍然是只是 x
那么为什么不切入正题呢。
其次,C不支持直接数组赋值,对字符串也没有真正的支持。
第三,不能修改文字串。
当你这样做时:
name = "Hello"; // Very bad idea, after malloc().
name[0] = 'X'; // Very bad idea, tries to modify the literal string.
您覆盖由malloc()
返回的指针用不同的指针,即存储在某处的常量字符串的地址。然后您尝试更改该常量字符串的第一个字符,这是不允许的。
应该是:
name = malloc(10);
snprintf(name, 10, "Hello");
name[0] = 'X'; // Perfectly fine, happens in memory from malloc().
这实际上使用了您分配的内存,这使得您在将字符串复制到内存中后想要进行的任何修改都有效。
您可能还想检查 malloc()
是否失败,在这种情况下 name
将为 NULL
。
关于c - 为什么这个使用 malloc 的非常基本的 C 代码会崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21549978/