环境 :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指向的字符常量块~属于非法写,必然报段错误~