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

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

为什么这边可以通过编译呢,如果可以直接赋值为什么还要手动分配内存。而且分配了内存为10,赋值超过10的大小也不会报错。

赋值方法不正确
str1 = "aaaaa";
这样并不是给str1指向的空间赋值,而只是把常量字符串"aaaaa"的首地址赋值给str1了
这个赋值和之前的内存分配没关系。同时这样赋值后,也不能修改str1了。
正确赋值方法是strcpy(str1, "aaaaa");追问

但是我在最后输出的时候是vvvvvvvvvvvvvvvvvvv不是aaaaaa,而且,刚刚也试了下strcpy赋值超出大小也没有报错。。

追答

第一个 用赋值的方法,你可以打印str1的值,用%p,可以看到会变化
第二个,strcpy越界只是不可预知后果,是不是会崩溃要看运气

温馨提示:答案为网友推荐,仅供参考
第1个回答  2017-06-29
是的,int p;就给p分配了4字节内存,只不过这个内存里没有数据;int p =4;才向里面赋了数据
这是系统决定的(你返回特定的类型的话,其他指针类型怎么用?)
是的
malloc(4)分配了四个字节的空间,并返回这个空间的首地址!把首地址强制转换为int *;然后赋值给p,于是p就指向了这个4字节空间

纯手打,希望能帮到你!
第2个回答  2017-06-29
语法没有逻辑错误程序就能正常编译,这个没毛病吧,你需要重新理解编译这词
接下去就是运行了,你知道为什么需要分配内存吗。目的是为了可以确保分配的内存不会出问题,举个例子,内存总共才10KB,程序运行中,系统只剩下1KB可用内存,此时你想申请2KB内存,就会申请失败,因此发现了流程不能再继续,就可以判断发生了错误。此时如果你没有申请内存而直接去赋值2KB数据,程序照做了,可这个过程变得不可预知,因为你知道只有1KB的内存,剩下的1KB数据去哪了?想深入了解关键词,内存泄漏,溢出,越界,权限
相似回答