如下代码:
#include <stdio.h>
#include <stdlib.h>
int main()
{
char *a=(char *)malloc(5*sizeof(char));
char *b=(char *)malloc(5*sizeof(char));
a="1234";
b="5678";
printf("%s\n",a);
printf("%s\n",b);
free(a);
free(b);
return 0;
}
运行时显示错误:free(): invalid pointer
a 和 b 互不相干,为什么就 free 出问题了呢?
1
huaouo 2019-06-12 00:00:17 +08:00 via Android 1
因为 free 的不是 malloc 出来的堆上的地址,而是"1234", "5678"这两个字符串字面值的地址。
|
2
Nitroethane 2019-06-12 00:01:48 +08:00 via Android
"1234" 和 "5678" 是字符串字面量,是保存在可执行二进制文件里面的
|
3
byteli 2019-06-12 00:01:49 +08:00 via Android
很久不写 c 猜测下,是 a= b=造成的隐式转换吧,要用*a= *b=
|
4
creamiced 2019-06-12 00:04:15 +08:00 1
赋值方式有问题,可以使用类似 strcpy(a,"1234")
a="1234"之后,a 已经不再指向 malloc 出来的内存,而是指向 1234 这个字符串常量的地址了 |
5
africwildman OP |
6
PanPancf 2019-06-12 00:07:44 +08:00
free 错了,还导致了 memory leak。。你的本意应该要 strcpy
|
7
elfive 2019-06-12 06:37:12 +08:00 via iPhone
对 char*的赋值就错了……你要用 strcpy 或 memcpy 去给它赋值成其他字符串的……
|
8
tamlok 2019-06-12 08:50:15 +08:00 via Android
建议再认真看看 c 教材。。。
|
9
zycpp 2019-06-12 09:18:02 +08:00 via iPhone
哈哈哈,跟我以前一样
ps:sprintf 也能赋值字符串 |
10
testeststs 2019-06-12 10:18:00 +08:00
a="1234";
这个你不会以为是拷贝吧。 |
11
haozhang 2019-06-12 10:28:53 +08:00 via Android
a="1234" 这一句就是错的,“ 1234 ”是 const char *,而 a 是 char *,按照理论上,你无法把一个 const char *赋值给 char *,你这个就编译不过去。
|
12
haozhang 2019-06-12 10:32:50 +08:00 via Android
“ 1234 ”这个是字符串常量,存放在堆上面的,内存的开辟释放都是由汇编写死的,不需要你去 free,a=1234,相当于把 1234 的存放的内存地址赋值给 a,但这么做是非法的,因为 a 是 char*,1234 是由一个 const char *指向的,你无法把一个 const char *赋值给 char *变量
|
13
zwh2698 2019-06-12 11:07:26 +08:00 via Android
大侠,看到你的标题我吓到了,看到代码,我想说看看谭浩强的书,不用求人。
|
17
oaix 2019-06-12 14:06:55 +08:00
不要使用 strcpy,使用带长度参数的 strncpy
|