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

环境 :Linux Ubuntu 14.04

 #include<stdio.h>
 #include<string.h>
 #include<malloc.h>
 int main()
 {
        char *str1;
            char *str2="hello";
            char *str3="world";
            str1=malloc(3*sizeof(char));
            strcpy(str1,str3);//  copy 1
            puts(str1);
            strcpy(str2,str3);//   copy 2
            puts(str2);
            return 0;
 }

为什么str2这种分配内存的方式 copy 2不能执行成功(puts(str2)不能输出),而str1这种分配内存的方式能成功,两者有什么区别?

str2指向常量区,不能strcpy赋值

str2代表的是hello存储的首字母的地址

bdmh正解。程序居然不core dump?

1、str1是申请堆内存,malloc返回申请内存的首地址给str1,所以你copy就把数据拷贝到已str1为首地址的堆内存中,另外你只申请了3个字节拷贝了6个字节的数据,其结果是不确定的,很可能会导致程序崩溃
2、 char *str2="hello";//这句只是说常量区有一快内存存储了数据hello,然后你定义一个指针,让这个指针指向hello的首地址。那么str2也就是其首地址,即在常量区,你去改变常量区的数据当然是不行的

str1=malloc(3*sizeof(char));str1指向的空间只分配理3个字节。怎么能正常复制?

str2指向的是常量区,你的程序没报段错误吗

str2指向常量区,不能strcpy赋值

str1=malloc(3*sizeof(char));//str1你通过库函数malloc在堆上申请了内存,可以执行接下来的strcpy( ),不过你申请的内存不足str3的大小7=6+1(结束符)所以没有把结束符复制过去,之后处理字符串可能会有麻烦,比如printf()函数处理s%格式输出字符串时输出str1前三个字符之后没有遇到结束符,会继续输出导致访问越界,输出乱码~

char *str2="hello";
char *str3="world";
"hello""world"是常量数据,存放在程序块的数据常量区,常量区在程序编译时就已经分配好了,程序运行中不能更改,也就是只读区域,str2、str3是字符指针指向了常量区两个字符串~
strcpy(str2,str3);// 将str3指向的字符常量块复制到str2指向的字符常量块,试图修改str2指向的字符常量块~属于非法写,必然报段错误~