请教:关于指针和指针的指针内存释放放

千里之行 始于足下精诚所至 金石为开
欢迎加入我们,一同切磋技术。 &
用户名: &&&
密 码: &
共有 2192 人关注过本帖
标题:函数调回指针的内存释放,(30分)请评价我编写的一个程序,
等 级:论坛游侠
帖 子:63
专家分:163
结帖率:100%
&&已结贴√
&&问题点数:30&&回复次数:7&&&
函数调回指针的内存释放,(30分)请评价我编写的一个程序,
比如说你申明一个函数
char *string_cmp(char *str, const char *str1)
在其中你为要返回的指针用malloc申请了一快内存地址,那你该如该将其释放呢?
上次的回答我不是很满意,请大家看看我写的一个程序吧。
函数调回指针的内存释放(25分)
程序代码:#include &stdio.h&
#include &string.h&
#include &stdlib.h&
#define MAX 256
static char *&&&&&&&&&&&&&&& //函数find_char的返回指针,返回被找到的字符,
char *find_char(char const *source, char const *chars);
//参数要搜索的字符串指针和给定字符集合
//带回找到的字符的集合的指针
int main (void)
&&& char *main_
&&& if ((main_findchars = (char *)malloc(sizeof(MAX))) == NULL)
&&&&&&&&printf(&malloc error!\n&);
&&&&&&&&exit(<font color=#);
&&& printf(&we will find if there are members of the chars 'a,g9cd'&);
&&& printf(&in the string we input.\n&);
&&& main_findchars = find_char(&gfdgadgasd^(hdf8fgjgh,uy,i,oipujikthetwerqw&, &a,g9cd&);
&&& printf(&the chars we find from the strings is %s\n&, main_findchars);
&&& free(main_findchars);
&&& free(findchars);
&&& return <font color=#;
char *find_char(char const *source, char const *chars)
&&& int count = <font color=#;
&&& int i = <font color=#;
&&& int j = <font color=#;
&&& int charlen = strlen(chars);
&&& int sourcelen = strlen(source);
&&& int findc_yes_no[charlen];&&&&&&&&&&&&&&&&&&&&&&&&//数组每一位对应给定字符集中的相应的字符
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //暂且称为开关数组,1和0代表有和没有
&&& if ((findchars = (char *)malloc(sizeof(chars))) == NULL)
&&&&&&&&printf(&malloc error!\n&);
&&&&&&&&exit(<font color=#);
&&& for(i = <font color=#; i & i++)
&&&&&&&&findc_yes_no[i] = <font color=#;
&&&&&&&&*(findchars + i) = '<font color=#';
&&& for (i = <font color=#; i & i++)
&&&&&&&&for(j = <font color=#; j & j++)
&&&&&&&&&&&&if(*(source + i) == *(chars + j))
&&&&&&&&&&&&{
&&&&&&&&&&&&&&& /*打印找到的字符在字符串中所处的位置*/
&&&&&&&&&&&&&&& printf(&find char '%c' from the %dth of the strings\n&, *(chars + j), i + <font color=#);
&&&&&&&&&&&&&&& findc_yes_no[j] = <font color=#;
&&&&&&&&&&&&}
&&& for (i = <font color=#; i & i++)&&&&&&&&&&&&&&&&&&&&//检查开关数组相应字符位
&&&&&&&&if (<font color=# == findc_yes_no[i])&&&&&&&&&&&&&&&&&&&&& //字符位若为1,把该字符放到findchars中去
&&&&&&&&&&&&*(findchars++) = *(chars + i);
&&&&&&&&&&&&count++;
&&& return (findchars - count);
我是在函数中为返回指针开辟了动态存储空间,为了能在最后释放它,我把指针定义在函数外面,这样我就能在主函数中释放它,请问这种方法可行吗?有没有更好的方法,如果有请不吝赐教,非常感谢!
搜索更多相关主题的帖子:
等 级:业余侠客
帖 子:166
专家分:289
main_findchars = (char *)malloc(sizeof(MAX)) // 指针指向你分配的地址
main_findchars = find_char(&gfdgadgasd^(hdf8fgjgh,uy,i,oipujikthetwerqw&, &a,g9cd&); // 指针指向你找到后返回的地址
你只是改变了指针的指向而已。
main_findchars = (char *)malloc(sizeof(MAX))// 这样写没意义啊
等 级:蜘蛛侠
帖 子:284
专家分:1159
通俗点说,就是栈里面的内存空间分别属于不同的函数所有,但是堆里面的内存属于共用的,不是属于某个函数,你在某个函数里面申请了内存,只能表示堆中的某块内存被使用了,但是不表示这块内存属于某个函数,所以在堆中申请的内存可以在任何地方释放~~~~
等 级:蜘蛛侠
帖 子:635
专家分:1080
代码错误很多
不过和你问的问题无关就不说了。。。
看你的问题是在函数里动态申请了一块内存
但是返回值却不是指向这块内存的指针
所以你头疼释放问题。。。
解决方法之一就是给find_char函数加一个char**类型的形参
程序代码:char *find_char(char const *source, char const *chars, char** buffer)
&&& *buffer = (char *)malloc(sizeof(chars));
int main()
&&& chat* main_
&&& main_findchars = find_char(&gfdgadgasd^(hdf8fgjgh,uy,i,oipujikthetwerqw&, &a,g9cd&, &temp);
&&& if (NULL != temp)
&&&&&&&&free(temp);
&&&&&&&&temp = NULL;
[ 本帖最后由 succubus 于
08:54 编辑 ]
[url=http://dragcave.net/view/aDU1][/url]
等 级:论坛游民
帖 子:16
专家分:21
不懂啊,悲哀
等 级:贵宾
威 望:29
帖 子:1164
专家分:3536
回复 楼主 csj_65
回答楼主最后的问题:
你可以在在一个被调函数中开辟一个内存,而不在被调函数里释放它。
但是你得把这片内存的首地址返回给主函数或者主调函数,并用一个指针接受,
然后在主调函数或者主函数结束前释放这个指针就可以了。
等 级:贵宾
威 望:29
帖 子:1164
专家分:3536
回复 3楼 kingsroot
我不是很同意二楼的说法。
我个人认为:堆区和栈区的数据的不同之处在于二者的生存期不同。
堆区的生存期一般是整个程序的运行时间或者说是它没有被释放之前。
而栈区的数据的生存期,一般是一个函数的运行时间。
等 级:论坛游侠
帖 子:78
专家分:161
c语言的内存分配类型问题。
1,text类型,就是code,只读,加载二进制文件的时候直接拷贝到只读区域。
2,static类型,生命周期整个程序运行期间,在二进制文件加载的时候直接拷贝到内存,可读写,公共变量和static 关键字申请的变量属于这种类型。
3,栈类型,也就是最普通的int ,long,等申请的空间,在栈上分配,生命周期在函数内,就是说如果是函数中申请的,推出这个函数时会清除掉。注意他不是直接拷贝到堆栈上的,而是系统push()到堆栈上的,所以,在函数内你可以这么写:int n = 10; int arr[n];但是在所有函数之外就不可以,因为公共变量存在静态区域,需要加载是直接拷贝到内存,而这个时候编译认为n是未知的。但是用push()加载的话,loader可以先取n的值,从而之际到需要push()多少个空间。
4,堆类型,就是malloc()申请的,其实malloc函数封装了一个系统调用,这个调用分配一部分由内核管理的内存空间,由内核记录这段空间的开始终止地址,并返回开始地址;而且这段内存的唯一标记就是开始地址,所以任何函数内只要free(p);就是调用一个系统调用释放p开始的地址空间,所以p = malloc(),可以在任何一个函数内使用,而在其他函数内free(p)就可以释放这段内存。没错,如果你随便free(x)一个地址,而如果x恰好是某块内存开始地址的话,那么这块内存会被释放。
[ 本帖最后由 wsj3000 于
20:32 编辑 ]
版权所有,并保留所有权利。
Powered by , Processed in 0.023789 second(s), 8 queries.
Copyright&, BCCN.NET, All Rights Reserved本帖子已过去太久远了,不再提供回复功能。[讨论] 日 主题:关于指针和堆栈 &#8211; QDAC官方网站
& [讨论] 日 主题:关于指针和堆栈
【码神】[长春]swish() 21:17:40
这块要明白一个东西,我们程序所能操作的数据,从CPU的角度来看,只是在寄存器中的那几个东西。剩下的内存中的东西,磁盘上的东西,实际上对于CPU核心来说,都是外部的东西。
【码神】[长春]swish() 21:19:07
就象对一个人来说,你大脑所能操纵的是你自己的身体和四肢,通过你的身躯和语言去操纵身边的人和物
【码帝】【宁波】空(:19:09
变量是地址的别称啊
【码神】[长春]swish() 21:19:32
对的,对于CPU里说,内存也不是它能直接操纵的
【码神】[长春]swish() 21:20:24
所以,这就存在一个问题,我们要操纵一块内存怎么办?
【码神】[长春]swish() 21:21:54
我们要使唤一个人,首先就要知道这个人在那儿,你连这个人都找不到,你想操作他,那就是属于白日做梦了。同理你操纵一块内存时,当然也要知道这块内存在那儿,这样子才有机会去操纵它。
【码神】[深圳]音儿小白() 21:22:08
@[长春]swish 所以我们看反汇编, 有一堆的 mov eax, [xxxx]
【码神】[深圳]音儿小白() 21:22:44
内存地址都必须放到寄存器后,才能进行运算
【码神】[长春]swish() 21:23:33
我们用来标明内存块的位置,就是地址。用来存放这个地址的变量,在编程语言里就叫做指针。
【码神】[长春]swish() 21:24:17
这样子说大家应该明白了,指针就是在编程语言中用于存贮一块内存的地址的变量。
【码神】[长春]swish() 21:25:11
那么问题来了,这个变量本身它也需要占用内存,所以,它也会有自己的地址。这个地址它又存在那里?
【码神】[长春]swish() 21:27:15
我们声明一个指针类型的变量,99%的情况是存在栈里,而剩下的1%是存在堆
【码神】[长春]swish() 21:27:52
【码神】[长春]swish() 21:28:15
这个p本身的地址是存在栈里的,而不是在堆里。
【码神】[长春]swish() 21:29:26
但是好玩的是指针里存的地址,99%却是堆里的
【码神】[长春]swish() 21:31:16
咱们以一个简单的例子来说明指针这个事:
S:UnicodeS
SetLength(S,0);
SetLength(S,100);
S:=&#8217;abc&#8217;;
S:=&#8217;def&#8217;;
【码神】[长春]swish() 21:31:47
这个例子很简单,UnicodeString 是 XE 以后默认的 String 对应的类型
【码神】[长春]swish() 21:32:24
这里注意一个问题,String 并不是一个简单类型
【码妖】[青岛] 阿木() 21:33:05
string是一个自己生命周期的特殊对象
【码神】[长春]swish() 21:33:11
为了了解 String 这个类型的本质,我们将其对应的 C++ 定义挪过来
【码神】[长春]swish() 21:34:34
我们捡核心的来
【码神】[长春]swish() 21:34:35
#pragma pack(push,1)
struct StrRec {
#ifdef _WIN64
#endif /* _WIN64 */
unsigned short codeP
unsigned short elemS
#pragma pack(pop)
const StrRec& GetRec()
StrRec& GetRec();
WideChar *D
【码神】[长春]swish() 21:35:12
这是它的定义,可以看到它是一个 StrRec 记录+一个数据指针的形式
【码神】[长春]swish() 21:35:27
现在回到例子:
S:UnicodeS
【码神】[长春]swish() 21:35:39
我们讨论下这发生了什么?
【码神】[深圳]音儿小白() 21:36:47
在栈上建立了一个StrRec
【码神】[长春]swish() 21:36:52
首先,由于在栈上分配内存,所以 S 的地址就是当前栈顶的地址,然后将这个地址就会当成是变量S的地址,我们 @S 时得到的就是这个地址。
【码神】[长春]swish() 21:37:19
音儿落下了Data 成员
【码神】[长春]swish() 21:37:58
是 ESP 的值增加了至少 StrRec+Data 这个值
【码神】[深圳]音儿小白() 21:38:08
【码神】[长春]swish() 21:38:46
@S 这个得到的值如果我们赋给一个变量,这个变量就是一个指针类型的变量
【码神】[长春]swish() 21:39:09
接着再往下走,看看 SetLength(S,0) 会发生什么?
【码神】[长春]swish() 21:39:43
实际上,UnicodeString 做为 Delphi 的内部类型,享受了许多高级待遇。
【码神】[长春]swish() 21:40:07
1、它不象普通的记录,它会被初始化
2、它的值会自动清理;
3、它基于引用计数来管理 Data 成员的释放;
【码神】[长春]swish() 21:41:58
现在实际上在 SetLength 之前,它已经象音儿说的,初始化原来的ESP地址到新的 ESP 地址之间的栈上的内存块的内容为0。
【码神】[长春]swish() 21:42:53
然后调用 SetLength 时,它会比较StrRec.Length与你需求的Length的长度,如果一样就啥也不干
【码神】[长春]swish() 21:45:13
SetLength(S,100)
这个做的事情就是比较长度,然后用 GetMem 分配100字节的内存,并把它的地址保存到 Data 成员上,这个Data 就是指向这块新内存的指针了,原来是指向空地址的,现在有新地址了。
【码神】[长春]swish() 21:46:41
我们跑到下一步:
S:=&#8217;abc&#8217;;
这个发生什么?
【码神】[长春]swish() 21:49:22
abc 首先是一个字符串常量,这个东西会首先会在内存的某个不起眼的角落里呆着
【码神】[长春]swish() 21:49:57
这个实际上发生了好几件事
【码神】[长春]swish() 21:53:23
第一句是将 S 的地址存到eax里,第二步是将&#8217;abc&#8217;这个常量在内存中的地址给放到edx里
然后调用UStrLAsg 这个函数来完成实际的赋值过程
【码神】[长春]swish() 21:54:12
procedure _UStrLAsg(var Dest: UnicodeS const Source: UnicodeString); // locals
if Pointer(Source) && nil then
_UStrAddRef(Pointer(Source));
P := Pointer(Dest);
Pointer(Dest) := Pointer(Source);
_UStrClr(P);
【码神】[长春]swish() 21:54:29
好了,这个函数的源码咱们是可以看到的
【码神】[长春]swish() 21:56:23
翻译上面的代码就是:如果源不为空,则将源的引用计数+1,然后将源的地址保存到目标地址上去
【码神】[长春]swish() 21:57:36
但你注意到它的参数了吧,&#8217;abc&#8217;已经是一个UnicodeString了,所以实际上你定义的字符串常量已经在启动时变成UnicodeString了
【码神】[长春]swish() 21:57:50
注意一点,WideString 没有引用计数
【码神】[长春]swish() 21:59:40
所以实际上做的事情咱们完整说下来是:
1、将 abc 通过空所说的Move方式保存起来,此时其引用计数为1;
2、将这个字符串中数据的地址赋给目标变量s,同时增加引用计数;
3、清理掉原来的内存块;
【码神】[长春]swish() 22:01:01
好了,现在咱们再扯回指针。
【码神】[长春]swish() 22:01:41
看看都发生了啥变化,都有什么东西游来游去。
【码神】[长春]swish() 22:02:11
在整个过程中,S 这个变量所在的栈的位置是不变的,所以 @S 的值就是固定的
【码神】[长春]swish() 22:02:43
无论你对 S 赋值还是删除元素,@S 永远和你函数刚进来时一样。
【码神】[长春]swish() 22:04:02
同样,由于@S 这个地址到 @S+SizeOf(S) 这段地址中各个元素的地址也是不变的,也就是说,Data 这个指针的自身的地址也是不变的,变的只是 Data 这个地址存的内容
【码神】[长春]swish() 22:07:26
咱们简化下,假设 S 在栈上的地址是0,Data 本身的地址咱不算了,随便指定一个,假设是16,初始化完成后,这个内存块是这样子的:
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
此时,Data 的内容从16-19这四个字节的内容是 0 0 0 0
当我们用SetLength或者赋值等等方式,Data 保存了新的地址,假设这个地址是 1,上面的内容就会变为
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
【码神】[长春]swish() 22:07:55
之所以1在前面是因Windows 是LE 编码,小头在前,这个简单说一下
【码神】[长春]swish() 22:08:28
此时,@Data 的地址不变,Data 的内容变了,变成了1
【码神】[长春]swish() 22:09:51
现在继续,既然指针指向的是一个地址,那么,根据一个萝卜一个坑的原则,通过指针,你访问数据时,永远只能直接访问的是当前元素
【码神】[长春]swish() 22:10:36
但拨萝卜可以一个个的拨,所以,地址可以一个个的往下跳,也可以往前跳
【码神】[长春]swish() 22:12:56
说到这里,我们就要了解跳坑的规则
【码妖】[青岛] 阿木() 22:13:00
那data的内容是在堆还是栈?
【码帝】【宁波】空(:13:11
@[青岛] 阿木 堆
【码神】[长春]swish() 22:13:55
指针类型的跳坑原则就是只能整数倍跳,不能半个半个跳
【码妖】[浙江]空号WaxBerray() 22:14:30
堆最大能分配多大?
【码神】[长春]swish() 22:15:13
如果不考虑32位和64位程序的区分,堆能分配的大小受物理可用内存限制
【码神】[长春]swish() 22:15:34
这个咱们以前讨论过
【码妖】[浙江]空号WaxBerray() 22:15:34
【码神】[长春]swish() 22:15:45
栈默认是1MB
【码神】[长春]swish() 22:15:57
可以在项目设置里修改
【码神】[长春]swish() 22:16:14
咱先继续,一会再讨论堆和栈的问题
【码神】[长春]swish() 22:17:16
比如一个32整数类型的指针 P,当你加1时,它跳的是4个字节,当你减1时,它跳的是-4个字节,而不会是其它值
【码神】[长春]swish() 22:17:31
同样,一个PByte类型的指针,就是一个一个字节的跳了
【码神】[长春]swish() 22:18:18
它等价于:
P:=Integer(P)+SizeOf(TypeOfP);
【码神】[长春]swish() 22:20:26
正是因为指针类型跳的长度是固定的,而指针指向地址对应的内存块是连续的(99.9%的情况),所以你可以一次跳多个坑,当然跳多了越过界了,掉下去就是你自己的事了。
【码神】[长春]swish() 22:20:36
这也是指针使用的风险所在
【码妖】[浙江]空号WaxBerray() 22:21:39
那怎么避免这个风险呢?
【码神】[长春]swish() 22:21:50
因为指针可以随便的跳来跳去,在 C++ 中,将它归为了随机迭代器。关于随机迭代器的概念,咱也不拓展了,知道这么个事就好。
【码神】[长春]swish() 22:22:11
将来有兴趣学C++ 的STL 的时候,会了解到这些。
【码神】[深圳]音儿小白() 22:22:26
判断是不是超过上限
【码神】[深圳]音儿小白() 22:22:31
【码神】[长春]swish() 22:22:39
这个风险就是靠程序员来控制的,编译器无法替你控制
【码神】[长春]swish() 22:23:54
越界的话,最典型的是AV错误
【码神】[长春]swish() 22:24:39
但注意不是100%出,不能说越界就一定出
【码神】[长春]swish() 22:24:59
现在咱们的指针的说明基本也差不多了
【码神】[长春]swish() 22:25:10
回来再把堆和栈是怎么回事简单说下
【码神】[长春]swish() 22:26:23
栈上的内存是预分配的,不管你用不用,它都在那儿占着
【码妖】[浙江]空号WaxBerray() 22:26:58
为什么要这么设计栈?
【码神】[长春]swish() 22:27:09
堆上的内存是按需分配,只有用到时,你才会去申请,操作系统给你分配,用完,你需要负责将内存还回去的
【码神】[长春]swish() 22:27:44
为什么这么设计又是一个长篇大论了,简而言之的话,是为了方便和性能
【码神】[长春]swish() 22:28:57
因为是连续预分配的,所以你声明一个新的变量时,几乎是没有什么额外的开销,所唯一要做的,就是调整下ESP的值,内存分配就算完事了,释放的时候,再调整下ESP的值,内存释放也就算完事了,当然这是说简单类型。
【码神】[长春]swish() 22:29:36
而堆的话,内存分配因为是随用随申请,所以它的大小理论上仅受物理内存中的连续内存块大小限制。
【码神】[长春]swish() 22:30:09
堆上的内存申请理论上的上限是你物理内存中连续的最大块内存的大小。
【码帝】【宁波】空(:30:36
@[深圳]音儿小白 这个就是为什么这个月上了XE7之后我苦难的地方.纠结很久.
【码神】[长春]swish() 22:30:54
由于堆上的内存在不停的重复的申请和释放,也就引申出了内存碎片的概念,但不在咱们讨论的范围了。
【码神】[长春]swish() 22:31:10
先说这么些吧,有什么问题咱们再讨论
问题:UnicodeString 的 Length 是否就是字符数?
【码神】[长春]swish() 22:34:12
UnicodeString 的字符数和Length并不一定相等
【码神】[深圳]音儿小白() 22:34:19
那是什么?
【码帝】【宁波】空(:34:40
不是的. 字符计数不是这样的. 这个我也不确定.因为UNICODE的概念 计数是字数,1个字或许会有2个WIDERCHAR
【码妖】[浙江]空号WaxBerray() 22:34:46
一直以为是字符数量
【码神】[长春]swish() 22:35:06
Unicode 有所谓的扩展区的概念
【码神】[长春]swish() 22:35:15
扩展区的字符1个占4个字节
【码神】[深圳]音儿小白() 22:35:20
唉,咱们中文,英文,数字都没错的, 就是字符数
【码神】[长春]swish() 22:35:24
$DB00~$DFFF
【码神】[深圳]音儿小白() 22:35:40
好像别的语言会可能不一样
【码神】[长春]swish() 22:35:41
音儿,就是中文的时候出的问题
【码神】[长春]swish() 22:36:02
比如说这个字
【码神】[深圳]音儿小白() 22:36:05
中文在unicodestring中, 一个字符会有不是两字节的情况?
【码神】[深圳]音儿小白() 22:36:50
群主说说例外?
【码神】[长春]swish() 22:37:00
这个字估计很多人不认识:
【码神】[长春]swish() 22:46:23
还有一个提示吧,GBK 里,汉字也是2 或4个字节
【码神】[长春]swish() 22:46:38
GB2312算做 GBK 的子集
问题2:什么编码最省空间?
最省空间的是GBK编码,这个昨晚因为太晚没有做解释。许多人认为 UTF8 编码最省空间,但实际上不是的,UTF8 和 GBK 处理英文时都是 1 个字节,但处理中文时, GBK 编码要么是2个字节,要么是4个字节(极少数),而 UTF8 编码普遍是 3-4 个字节,综合下来,GBK 编码实际上占用的空间还是要略小。但 GBK 编码的劣势就是它是基于 GB2312 发展过来的,转换为 Unicode 编码时,实际上经过了一个查表转换的过程,通用性也稍差一点。
厉害了我的哥anjiu文章归档21ic官方微信-->
后使用快捷导航没有帐号?
查看: 1469|回复: 5
请教各位:关于C语言中调用函数返回指针的困惑(栈内存)
&&已结帖(20)
主题帖子积分
中级技术员, 积分 255, 距离下一级还需 45 积分
中级技术员, 积分 255, 距离下一级还需 45 积分
主题帖子积分
专家等级:结帖率:92%
主题帖子积分
中级技术员, 积分 255, 距离下一级还需 45 积分
中级技术员, 积分 255, 距离下一级还需 45 积分
struct student
struct student *fun2()
student stu1;
stu1.number=5489;
stu1.score=45.5;
student *stuptr=&stu1;
char *GetMemory(void)
char p[20] = &hello world&;
char *ptr=p;
这两个函数依次返回指向结构和执行数组的指针
我困惑的是第一个能够正常输出,而第二个返回数组的指针就是乱码,
我看了一下,说是第二个的原因是:
因为GetMemory 返回的是指向“栈内存”的指针,该指针的地址不是 NULL,但其原来的内容已经被清除,新内容不可知。
那么问题就来了,我的理解是第一个也应该是指向“栈内存”的指针,结构体stu1也是在栈内存中开辟的空间啊,函数执行完也应该类似于上边的数组,stu1也应该被自动释放的呀?那它为什么还是输出正确的值呢?而数组是乱码?
请各位指教一下 谢谢了!
, , , , , , , , ,
满意回复+10
两个都有同样的问题,指针指向一个已经被释放的空间,毫无意义。
释放!=清除
可以不等于一定可以,
两个都有问题,函数返回时,指定的内存已经无意义了
主题帖子积分
技术总监, 积分 39944, 距离下一级还需 10056 积分
技术总监, 积分 39944, 距离下一级还需 10056 积分
主题帖子积分
专家等级:结帖率:3%
主题帖子积分
技术总监, 积分 39944, 距离下一级还需 10056 积分
技术总监, 积分 39944, 距离下一级还需 10056 积分
可以不等于一定可以,
两个都有问题,函数返回时,指定的内存已经无意义了
主题帖子积分
初级技术员, 积分 79, 距离下一级还需 21 积分
初级技术员, 积分 79, 距离下一级还需 21 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
初级技术员, 积分 79, 距离下一级还需 21 积分
初级技术员, 积分 79, 距离下一级还需 21 积分
释放!=清除
频频回头的人,是走不了远路的。
主题帖子积分
初级工程师, 积分 2326, 距离下一级还需 674 积分
初级工程师, 积分 2326, 距离下一级还需 674 积分
主题帖子积分
专家等级:结帖率:33%
主题帖子积分
初级工程师, 积分 2326, 距离下一级还需 674 积分
初级工程师, 积分 2326, 距离下一级还需 674 积分
两个都有同样的问题,指针指向一个已经被释放的空间,毫无意义。
主题帖子积分
中级技术员, 积分 255, 距离下一级还需 45 积分
中级技术员, 积分 255, 距离下一级还需 45 积分
主题帖子积分
专家等级:结帖率:92%
主题帖子积分
中级技术员, 积分 255, 距离下一级还需 45 积分
中级技术员, 积分 255, 距离下一级还需 45 积分
那为什么指向结构体的输出值没有被改变,而字符串就是乱码呢?是不是内存释放后有的值被更改的原因啊?
主题帖子积分
中级技术员, 积分 255, 距离下一级还需 45 积分
中级技术员, 积分 255, 距离下一级还需 45 积分
主题帖子积分
专家等级:结帖率:92%
主题帖子积分
中级技术员, 积分 255, 距离下一级还需 45 积分
中级技术员, 积分 255, 距离下一级还需 45 积分
那这个函数退出 应该是释放指针了?那原来内存的值应该还是存在的啊?
荣誉元老奖章
等级类勋章
坚毅之洋流
发帖类勋章
时间类勋章
技术领袖奖章
人才类勋章
技术奇才奖章
人才类勋章
时间类勋章
精华达人奖章
等级类勋章
湍急之河流
发帖类勋章
技术导师奖章
人才类勋章
时间类勋章
热门推荐 /2

我要回帖

更多关于 智能指针内存释放 的文章

 

随机推荐