C 无法更改字符数组中的字符
根据这一问题: 使用malloc分配内存应该允许我更改数组中的一个字符。但是,此程序在运行时崩溃。有人能给点建议吗?(另一个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
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;