首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无法更改字符数组中的字符

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

Stack Overflow用户
提问于 2014-06-08 20:43:21
回答 2查看 1K关注 0票数 2

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

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

代码语言:javascript
运行
复制
char* ptr;
ptr = (char *)malloc(sizeof(char[10]));
ptr = "hello";
ptr[0] = 'H';
printf("The string contains: %s\n", ptr);
//free (ptr);
return 0;
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-08 20:45:57

您的程序崩溃,因为这行

代码语言:javascript
运行
复制
ptr = "hello";

从前面的行完全取消malloc的效果:

代码语言:javascript
运行
复制
ptr = malloc(sizeof(char[10])); // No need to cast to char*

它还会在执行过程中造成内存泄漏,因为malloc返回的地址在分配之后将无法恢复。

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

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

代码语言:javascript
运行
复制
strcpy(ptr, "hello");
票数 4
EN

Stack Overflow用户

发布于 2014-06-08 20:47:18

有几件事需要解决:

代码语言:javascript
运行
复制
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()中正确编译和运行。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24110640

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档