[C语言]

free问题

[复制链接]
1538|22
手机看帖
扫描二维码
随时随地手机跟帖
yanghelovehuang|  楼主 | 2018-8-25 17:23 | 显示全部楼层 |阅读模式
int main(int argc, const char *argv[])
{

        char *p = (char *)malloc(100);

        p = "hello woed";
        char a[100] = "hello woed";

        sort(p, a);

        free(p);
        p = NULL;

        return 0;
}
请问大神为什么我释放我申请的指针会出错??不是申请完空间后要释放吗? 这样释放不行那我该怎么释放申请的空间呢?

相关帖子

linqing171| | 2018-8-26 21:28 | 显示全部楼层
char *p = (char *)malloc(100);  =====>申请了100个字节,指针类型转换为char*,赋值给p

        p = "hello woed";    ======> 又把p指向了常量数组 "hello woed" ,原先p指向申请的空间,现在直接p被修改为另外一个地方了,申请的空间还在,只是没有指针指向它了。
......
free(p);  ====》 这里要释放 "hello woed" 这个常量,可是malloc申请的列表里根本就没有这个指针。

使用特权

评论回复
airwill| | 2018-8-27 06:29 | 显示全部楼层
是啊, 中途把指针改掉了.
指针要小心使用哪

使用特权

评论回复
yanghelovehuang|  楼主 | 2018-8-27 13:48 | 显示全部楼层
linqing171 发表于 2018-8-26 21:28
char *p = (char *)malloc(100);  =====>申请了100个字节,指针类型转换为char*,赋值给p

        p = "he ...

谢谢大神能够回复,p = "hello woed" 不是把字符串赋值到申请的空间里了吗?为什么改变了p的指向呢?

使用特权

评论回复
yanghelovehuang|  楼主 | 2018-8-27 13:52 | 显示全部楼层
airwill 发表于 2018-8-27 06:29
是啊, 中途把指针改掉了.
指针要小心使用哪

谢谢您能够回复,有一点我不太明白:我们定义一个字符串常量如char *a; 如果要给a赋值就要给a申请空间,不然没办法赋值;
就想我这样给指针申请了空间再赋值,可是指针的指向又改变了,那申请空间有什么用呢?
不知到我描述清楚没。

使用特权

评论回复
QuakeGod| | 2018-8-27 14:14 | 显示全部楼层
yanghelovehuang 发表于 2018-8-27 13:52
谢谢您能够回复,有一点我不太明白:我们定义一个字符串常量如char *a; 如果要给a赋值就要给a申请空间, ...

memcpy 或者 strcpy

使用特权

评论回复
yanghelovehuang|  楼主 | 2018-8-27 14:27 | 显示全部楼层

char *a;
        a = (char *)malloc(100);
        printf("malloc = %p\n", a);
        a = "fdasfs";
        printf("a = %p\n", a);

使用特权

评论回复
yanghelovehuang|  楼主 | 2018-8-27 14:28 | 显示全部楼层
本帖最后由 yanghelovehuang 于 2018-8-27 14:30 编辑

你好大神,我写程序实验了一下,程序如下:
        char *a;
        a = (char *)malloc(100);
        printf("malloc = %p\n", a);
        a = "fdasfs";
        printf("a = %p\n", a);
打印结果如下:
malloc = 0x9fae008
a = 0x9fae008
结果显示他们指向的地址是一样的,没有发生变化啊,您说指针改变了方向,为什么指向的地址想同呢?

使用特权

评论回复
yanghelovehuang|  楼主 | 2018-8-27 14:36 | 显示全部楼层

对不起 我搞错了 地址不一样 , 谢谢大神

使用特权

评论回复
yanghelovehuang|  楼主 | 2018-8-27 14:41 | 显示全部楼层

我有点不明白,一般p = "hello woed"代表的是赋值,就是把字符串赋值给p的空间,,为什么会改变p的指向呢?

使用特权

评论回复
Cjy_JDxy| | 2018-8-27 14:47 | 显示全部楼层
yanghelovehuang 发表于 2018-8-27 14:28
你好大神,我写程序实验了一下,程序如下:
        char *a;
        a = (char *)malloc(100);

1.jpg 我试的结果是不一样的。



使用特权

评论回复
yanghelovehuang|  楼主 | 2018-8-27 14:52 | 显示全部楼层
Cjy_JDxy 发表于 2018-8-27 14:47
我试的结果是不一样的。

嗯嗯 是不一样 我试错了,仅仅是赋值给p,为什么会改变p的指向呢?

使用特权

评论回复
Cjy_JDxy| | 2018-8-27 14:59 | 显示全部楼层
yanghelovehuang 发表于 2018-8-27 14:52
嗯嗯 是不一样 我试错了,仅仅是赋值给p,为什么会改变p的指向呢?

我试了一下你1楼的程序,我没写sort函数。
发现free释放空间没出错呀

使用特权

评论回复
yanghelovehuang|  楼主 | 2018-8-27 17:03 | 显示全部楼层
Cjy_JDxy 发表于 2018-8-27 14:59
我试了一下你1楼的程序,我没写sort函数。
发现free释放空间没出错呀

那个sort是我自定义的一个函数,,我不写sort函数试了下出现段错误啊
段错误 (核心已转储)

使用特权

评论回复
caijie001| | 2018-8-27 17:39 | 显示全部楼层
p = 是改变指针指向
*p 才是写内容

使用特权

评论回复
Cjy_JDxy| | 2018-8-27 17:41 | 显示全部楼层
yanghelovehuang 发表于 2018-8-27 17:03
那个sort是我自定义的一个函数,,我不写sort函数试了下出现段错误啊
段错误 (核心已转储) ...

2.jpg
我用DEV C++试的,没那个错误。

使用特权

评论回复
caijie001| | 2018-8-27 17:42 | 显示全部楼层
本帖最后由 caijie001 于 2018-8-27 17:47 编辑

建议这样子用:


1 /* 定义申请内存的指针 */
2 static uint32_t *p_test = NULL;
3
4 printf("正在向内存池申请内存...........\n");
5 p_test = malloc(TEST_SIZE);   /* 申请动态内存 */
6 if(RT_NULL == p_test) /* 没有申请成功 */
7     printf("动态内存申请失败!\n");
8 else
9     printf("动态内存申请成功,地址为%d!\n\n",p_test);
10
11 printf("正在向p_test写入数据...........\n");
12 *p_test = 1234;
13 printf("已经写入p_test地址的数据\n");
14 printf("*p_test= %.4d ,地址为:%d \n\n",*p_test,p_test);
15 free(p_test);



使用特权

评论回复
linqing171| | 2018-8-27 20:40 | 显示全部楼层
段错误 (核心已转储)  ===》  是用的微软的调试器吧,发现潜在错误的这种小功能比较强大。

新手还是学一下什么是指针吧。从汇编过来的人都知道 char *p 和int p一样,都是存寄存器里面的一个整数值,给它赋值就是把数放它里面,它只有一个寄存器大小(51等小MCU除外)。而要给它指向的内容赋值,需要用memcpy或者 *p=xx;  p[0]=xxx; 而不是 p=xxx;

使用特权

评论回复
linqing171| | 2018-8-27 20:42 | 显示全部楼层
int main(int argc, const char *argv[])
{

        int p = (int)malloc(100);

        p =(int)(char*) "hello woed";
        char a[100] = "hello woed";

        sort((char*)p, a);

        free((char*)p);
        ((char*)p) = NULL;

        return 0;
}


功能和你之前的代码一模一样。

使用特权

评论回复
yanghelovehuang|  楼主 | 2018-8-28 15:18 | 显示全部楼层

嗯嗯 谢谢您能够回复,谢谢您讲解的这么详细 学习了,谢谢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

156

主题

324

帖子

1

粉丝