如下代码:
#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"; pritf("%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 ![]() 因为 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 ![]() 赋值方式有问题,可以使用类似 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 |