
二级指针问题讨论.doc
11页voidmainO〃非常有趣…有空再硏究{char**p=(char**)malloc(5);p[0]二Bsdfp[l]="13212〃p=NULUfree(p);}问题1:就是只给p[0]赋值的时候,Itee就没出错,但是同时也给p⑴或者只级p[l]赋值的时候,就弹afternormalblock的错误!!问题2:就是在问题1那样出错的情况下,在free前加语句p二NUL蹴不出错了,但是我想这样free没意义啊,因为这个时候扉的p是NULL,而不是之前申请的地址,所以我根请问大牛们,像这样的2级指针,应该怎么样亓ee掉,问题3;想问下char**p二(cha严)malloc⑸;申请空间的大小5是指针什么的大小,这个大小是给谁的IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII程序二:GetMemory(char**p){*p=(char*)malloc(100);}mainO{char*str=NULL;GetMemory(&str);strcpy(strz"hello");printf(str);free(str);str="1231printf(str);}根问个问题,就是为什么已经free了str,为什么在后面还可以赋值啊。
照理此时的str是个野指针,要申请一块空间给他,然后才能赋值啊兄弟有什么好见解的速度发出来发表于:2007-11-2017:41:43璀得分:0char**p=(char**)malloc(5);内存分配写法错误应该是char**p二(char**)malloc(5*sizeof(char*));发表于:2007-11-2018:11:294^得分:0指针你的程序二,我每次都会说指针内存釋放后就没有意义了最好搭配使用free(p);p=NULL;但是你问的不是内存的问题对于一个指针来说,可以char*p=NULL;P二"123・;//123是有内存空间的,在常量存储区,p指针只是指向它仅此而已所以你指针释放也没关系发表于:2007-11-2019:58:205楼得分:0学习了OOO发表于:2007-11-2020:18:22锹得分:0p[0]二・sdf・;〃你把他指针地址都改变了不出错才怪纯粹一个泄露问题具体原因自己硏究楼主好好看看什么是指针变量发表于:2007-11-2020:20:547楼得分:0str="1231这是一个空间赋值吗发表于:2007-11-2020:38:168^得分01. 你释放了你没有申请的内存,肯定出错。
可以向楼上说的:char**p二(char**)maIloc(5*sizeof(char*));2. 你先把p赋值成NULL,那么内存就泄露了free-个空指针好像没问题3•是5个字节大小,5个指针的话像第一题那样传给maHoc的是字节大小4.野指针的问题,你free后,又把他扌旨向新的地址了难道这样有错吗:char*p二"abc・;你需要对p先申请一块内存吗?发表于:2007-11-2021:02:379楼得分:0第二个问题str二"1231这里"1234"是一个字符串,相当于一个字符数组J斤以这个语句其实是把字符串的首地址赋给了str.对于"问题3;想问下char"p=(char**)malloc⑸;申请空间的大小5是指针什么的大小,这个大小是给谁的说说个人看法,如果不对,也借贵宝地请大家指正p是一个指向指针的指针,由于前面用了char应该来说,这个指针是指向一个指向ch前型数据的指针,但是这里他指向一个单元,这个单元的大小为5个字节,而这个单元本身也是用来存放地址的,即这个单元有5个字节来存放一个地址所以个人认为这个语句没有什么意义,因为一般哙为每个指针开辟一段2个字节的空间,无论是一个几级指针,对于第一段程序的错误,我觉得很可能是你强行改变了这个单元大小,所以引起了一些不可预测的错误—孔之见不对的地方,请大大们解惑!发表于:2007-11-2022:14:4510^得分:0答得有点乱,就是大家不要把问题搞在char=(char**)malloc⑸;这一句上啊,你后面加上size。
他无非是看那个char的大小嘛,好,那我加上,不过问题还是一样出现,to楼上的,你说申请那个5没意义??那为什么我把5改成2就出错了啊,只给p[0]赋值的情况下,,还有,希望来个大牛,把大家答案整理下好吗?,发表于:2007-11-2022:27:2311楼得分:0char**p=(char**)maIloc(5*sizeof(char*));这样是不是才算给1级指针所要放字符串大小分配空间啊??char**p=(char**)maIloc(5*sizeof(char));而这样就只是给那个的地址申请大小??如果是这样,那为什么我把5改成2就出错了啊,只给p[0]赋值的情况下…发表于:2007-11-2022:50:3012楼得分:0char**p二(char**)maIloc(5*sizeof(char*));这样是不是才算给1级指针所要放字符串大小分配空间啊////刚刚证明了上面这个说法也不对,因为我在用这句strcpy(*str,"hf);的时候出错救命啊,有没哪个仁兄具体组织下程序一问题的答案啊,!!!!发表于:2007-11-2023:30:181璀得分:0问题1你给p分的空间大小是5,而两个char**的大小应该是8,p[l]='13212"使用了未分配的空间。
问题2可以无视你中间的malloc和free(多一个函数调用应该没影响吧?),直接就一句str="1231这是可以的z可以找旧贴看发表于:2007-11-2102:32:3115楼得分:01.1在第一个问题中,我的理解是这样,你只给p分配了5个字节大小,但是一个char★是占用了4个字节,因此你在p[l]="13212“是使用了未分配的空间,但是这一步编译器没有报错,允许你赋值错就错在你的巳编译器不允许你释放未分配的空间C/C++codevoidmainO〃非常有趣…有空再硏究{char**p=(char**)malloc(5);p[0]='sdfp[l]="13212//p二NULL;//free(p);把这句也注释起来,程序运行(即使你只给他分配了5字节,却利用了8字节的空间),但是把这句除去注釋,运行失败・}1.2这里我们在free前让p重新置空,当然free就没问题•因为没有释放未分配内存2•第2个问题我想应该跟C++的delete-样吧,free(p)只是释放p所当前指向的那块内存,这时p变为野指针,当然我们可以为他重新进行赋值.以上是本人愚见,我是学c++的…•…还请牛人指正.发表于:2007-11-2102:32:4515楼得分01.1在第一个问题中,我的理解是这样,你只给p分配了5个字节大小,但是一个char★是占用了4个字节,因此你在p[l]="13212“是使用了未分配的空间,但是这一步编译器没有报错,允许你赋值错就错在你的巳编译器不允许你释放未分配的空间C/C++codevoidmainO〃非常有趣…。
有空再硏究{char**p=(char**)malloc(5);p[0]='sdfp[l]="13212//p二NULL;//free(p);把这句也注释起来,程序运行(即使你只给他分配了5字节,却利用了8字节的空间),但是把这句除去注釋,运行失败・}1.2这里我们在free前让p重新置空,当然free就没问题•因为没有释放未分配内存2•第2个问题我想应该跟C++的delete-样吧,free(p)只是释放p所当前指向的那块内存,这时p变为野指针,当然我们可以为他重新进行赋值.以上是本人愚见,我是学c++的…•…还请牛人指正.发表于:2007-11-2102:33:3316^得分:01.1在第一个问题中,我的理解是这样,你只给p分配了5个字节大小,但是一个char★是占用了4个字节,因此你在p[l]="13212“是使用了未分配的空间,但是这一步编译器没有报错,允许你赋值错就错在你的巳编译器不允许你释放未分配的空间voidmainO〃非常有趣…有空再研究{char=(char**)malloc(5);p[0]=-sdf;p[l]='13212';//p=NULU//free(p);把这句也注釋起来,程序运行(即使你只给他分配了5字节,却利用了蒔节的空间),但是把这句除去注釋,运行失败.)1.2这里我们在free前,让p重新置空,当然free就没问题•因为没有释放未分配内存2•第2个问题我想应该跟C++的delete-样吧,free(p)只是释放p所当前指向的那块内存,这时p变为野扌旨针,当然我们可以为他重新进行赋值.以上是本人愚见我是学C++的.......还请牛人指正.发表于:2007-11-2108:01:3517楼得分:0mark发表于:2007-11-2110:32:0518^得分:0没啥可讨论的.发表于:2007-11-2110:45:0619楼得分:0问题1:就是只给p[0]赋值的时候,他点就没出错,但是同时也给p[l]或者只级p[l]赋值的时候,就弹afternormalblock的错误!!回答:Free出错的原因是是你分配的空间不够,越界了,要向2楼说的一样char**p=(char**)malloc(5*sizeof(char*));存放一个指针的长度为4个字节,你分配5个字节只够发一个指针,也就是说你只写p[0]="sdf";FreeB不会出错的。
但是加入p[l]=B13212・;就会出错顺便回你在:楼的问题"这样是不是才算给1级指针所要放字符串大小分配空间啊"这不是分配给"1级指针所要放字符串大小分配空间",而是分配存放指针的空间,这空间就四个字节问题2:就是在问题1那样出错的情况下,在free前加语句p二NUL蹴不出错了,但是我想这样free没意义啊,因为这个时候什卓的p是NULL,而不是之前申请的地址,所以我根请问大牛们,像这样的2级指针,应该怎么样free掉,回答:Free(NULL)当然没意义了你理解了第一个问题,第二个问题就会明白的问题3;想问下char=(char**)malloc(5);申请空间的大小5是指针什么的大小,这个大小是给谁的回答:就是分配5个字节的空间给,建议你学习C/C++分配内存方面的一些知识,对编程稳定还是会很有帮助的发表于:2007-11-2111:26:5620^得分:0楼上正解mallocO函数是按字节分配堆内存的,所以建议使用时应该这样写,Type*p=(Type*)malloc(n*sizeof(Type));发表于:2007-11-2111:36:2421楼得分:0HOHO,应该可以结贴了,我整理下来消化消化下,这么多人回答,偶不知道怎么加分。
吃饭消化中发表于:2007-11-2112:01:4322楼得分:0VC6.0没有错误第_个题目intmainOIchar**p=(char**)malloc(5*sizeof(char*));p[0]二Bsdfp[l]='13212';〃p=NULUfree(p);return0;}其实**p。












