无法更改char数组中的字符

时间:2014-06-08 20:43:22

标签: c malloc free

根据这个问题:When should I use malloc in C and when don't I?

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

char* ptr;
ptr = (char *)malloc(sizeof(char[10]));
ptr = "hello";
ptr[0] = 'H';
printf("The string contains: %s\n", ptr);
//free (ptr);
return 0;

2 个答案:

答案 0 :(得分:4)

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

ptr = "hello";

完全撤消前一行malloc的影响:

ptr = malloc(sizeof(char[10])); // No need to cast to char*

并且它还会在此过程中产生内存泄漏,因为malloc返回的地址在分配后无法恢复。

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

在C字符串中需要复制,如果您想稍后修改它们,则不需要分配。用strcpy调用替换该作业以解决此问题。

strcpy(ptr, "hello");

答案 1 :(得分:1)

有几件事需要修复:

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()

中编译并正确运行