关于C语言内存分配的问题

char*str1,*str2;str1=calloc(10,sizeof(char));str1="aaaaa";str1="vvvvvvvvvvvvvvvvvvv";... char* str1,*str2;
str1 = calloc(10,sizeof(char));
str1 = "aaaaa";
str1 = "vvvvvvvvvvvvvvvvvvv";
str2 = "ggggg";

为什么这边可以通过编译呢,如果可以直接赋值为什么还要手动分配内存。而且分配了内存为10,赋值超过10的大小也不会报错。
展开
 我来答
风若远去何人留
2017-06-29 · 知道合伙人互联网行家
风若远去何人留
知道合伙人互联网行家
采纳数:20412 获赞数:450133
专业C/C++软件开发

向TA提问 私信TA
展开全部
赋值方法不正确
str1 = "aaaaa";
这样并不是给str1指向的空间赋值,而只是把常量字符串"aaaaa"的首地址赋值给str1了
这个赋值和之前的内存分配没关系。同时这样赋值后,也不能修改str1了。
正确赋值方法是strcpy(str1, "aaaaa");
追问
但是我在最后输出的时候是vvvvvvvvvvvvvvvvvvv不是aaaaaa,而且,刚刚也试了下strcpy赋值超出大小也没有报错。。
追答
第一个 用赋值的方法,你可以打印str1的值,用%p,可以看到会变化
第二个,strcpy越界只是不可预知后果,是不是会崩溃要看运气
ve...9@33sn.cc
2017-06-29 · 超过17用户采纳过TA的回答
知道答主
回答量:87
采纳率:0%
帮助的人:14.4万
展开全部
是的,int p;就给p分配了4字节内存,只不过这个内存里没有数据;int p =4;才向里面赋了数据
这是系统决定的(你返回特定的类型的话,其他指针类型怎么用?)
是的
malloc(4)分配了四个字节的空间,并返回这个空间的首地址!把首地址强制转换为int *;然后赋值给p,于是p就指向了这个4字节空间

纯手打,希望能帮到你!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友552a555
2017-06-29 · TA获得超过2259个赞
知道大有可为答主
回答量:2433
采纳率:22%
帮助的人:722万
展开全部
语法没有逻辑错误程序就能正常编译,这个没毛病吧,你需要重新理解编译这词
接下去就是运行了,你知道为什么需要分配内存吗。目的是为了可以确保分配的内存不会出问题,举个例子,内存总共才10KB,程序运行中,系统只剩下1KB可用内存,此时你想申请2KB内存,就会申请失败,因此发现了流程不能再继续,就可以判断发生了错误。此时如果你没有申请内存而直接去赋值2KB数据,程序照做了,可这个过程变得不可预知,因为你知道只有1KB的内存,剩下的1KB数据去哪了?想深入了解关键词,内存泄漏,溢出,越界,权限
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式