c - 为什么这个使用 malloc 的非常基本的 C 代码会崩溃?

标签 c malloc

我是 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/

相关文章:

c - 尝试释放内存时出错

c - 为什么指针数组的 free() 不释放内存?

使用File IO和2Darray比较C语言中的字符串错误

java - java中调用在另一台服务器上运行的C函数的最佳方法是什么?

c - 将字符数组划分为标记

c - void* 类型转换打破了严格的别名?

c - Malloc 影响随机整数值

objective-c - 检测正在运行的应用程序是否被沙盒化

c - 如果进程在 MPI_Recv 上挂起,则 MPI C fprintf() 输出不会显示

c - 为什么这个 C 程序不会崩溃?