C 无法更改字符数组中的字符

C 无法更改字符数组中的字符,c,malloc,free,C,Malloc,Free,根据这一问题: 使用malloc分配内存应该允许我更改数组中的一个字符。但是,此程序在运行时崩溃。有人能给点建议吗?(另一个free(ptr)会导致不同的崩溃,这就是它被注释掉的原因) 你的程序崩溃了,因为这行 ptr = "hello"; 完全取消上一行的malloc效果: ptr = malloc(sizeof(char[10])); // No need to cast to char* 同时,它也会造成内存泄漏,因为分配后,malloc返回的地址将无法恢复 赋值完成后,尝试设置ptr

根据这一问题:

使用malloc分配内存应该允许我更改数组中的一个字符。但是,此程序在运行时崩溃。有人能给点建议吗?(另一个
free(ptr)
会导致不同的崩溃,这就是它被注释掉的原因)


你的程序崩溃了,因为这行

ptr = "hello";
完全取消上一行的
malloc
效果:

ptr = malloc(sizeof(char[10])); // No need to cast to char*
同时,它也会造成内存泄漏,因为分配后,
malloc
返回的地址将无法恢复

赋值完成后,尝试设置
ptr[0]='H'
会导致崩溃,因为您试图修改字符串文本本身的内存-即未定义的行为

在C语言中,如果以后要修改字符串,则需要复制字符串,而不是指定字符串。将分配替换为
strcpy
调用以解决此问题

strcpy(ptr, "hello");

有几件事需要解决:

char* ptr = 0;
ptr = (char *)malloc(sizeof(char)*10);
if(!ptr)
    return 0; // or something to indicate "memory allocation error"
strcpy(ptr, "hello");
ptr[0] = 'H';
printf("The string contains: %s\n", ptr);
free (ptr);
return 0;

这可以在main()中正确编译和运行。

您应该解释为什么不只是发布codeyes,而是在我写完我的答案后看到dasblinkenlight的答案,所以我觉得没有必要再改进我的答案了。我本来可以删除它,但我离开它是因为
malloc
返回值检查。
char* ptr = 0;
ptr = (char *)malloc(sizeof(char)*10);
if(!ptr)
    return 0; // or something to indicate "memory allocation error"
strcpy(ptr, "hello");
ptr[0] = 'H';
printf("The string contains: %s\n", ptr);
free (ptr);
return 0;