C语言内存分配问题

void main(void)
{
char *str;// =NULL;

str = (char *)malloc(50);
str = "jjjlk";
strcpy(str+6,"hello world");
printf(str);
}
为什么有异常出现,好像是strcpy的问题,为什么?

哦,运行时有异常.你的str申请完空间后,下一个赋值语句str="jjjik",使指针指向了字符串"jjjik"的内存,把原先的空间丢失了,内存泄漏;而下一句,strcpy(str+6,"hello world"); 的错误就更多了:首先,str指向的内存空间只有6个字节(还有一个'\0'),str+6内存越界,把"hello world"写到没有申请的内存里;其次,str="jjjik"是一个赋值语句,常量字符串的类型是const char *的,赋值以后str也变成const char *类型,这种类型是常量类型,常量是不容许修改的。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2008-09-09
void main(void)
{
char *str;// =NULL;

分配50Byte内存
str = (char *)malloc(50);
让str丢掉原来分配的内存,指向字符串"jjjlk",因此其空间只有6Byte
str = "jjjlk";
你想将hello world连接到str后面,但是这时候str所指向的空间不够,所以出错
strcpy(str+6,"hello world");
printf(str);
}

----------------
修改后
void main(void)
{
char *str;// =NULL;

str = (char *)malloc(50);
*str = '\0';
strcat(str, "jjjlk");
strcat(str, "hello world");
printf(str);
free(str);
}
第2个回答  2008-09-09
出错并不是空间不足,当然空间不足也会引发各种问题。

但是现在这里并不是空间不足的错误,而因为是str被指向了常数字符串"jjjlk",它是只读的不允许修改的,而strcpy试图修改它所以出错了。

解决办法楼上各位已经说了。
第3个回答  2008-09-09
void main(void)
{
char *str;// =NULL;

str = (char *)malloc(50);
strcpy(str,"jjjlk"); //指针不能直接赋值;这们就可以了。

strcpy(str+6,"hello world");
printf("%s",str);//输出时应加上 格式控制,否则应使用puts(str);
}
第4个回答  2008-09-09
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void main()
{
char *str;
str=(char *)malloc(50);
str="jjjlk";
strcpy(str+6,"hello world");
puts(str);
free(str);
}
相似回答