首页 > 其他分享 >字符串逆序输出改错(二)(二级指针)

字符串逆序输出改错(二)(二级指针)

时间:2023-10-22 18:34:28浏览次数:33  
标签:char malloc NULL dest len 改错 逆序 指针

代码:如下

 1 #include <malloc.h>
 2 #include <stdio.h>
 3 
 4 void getMemory(int len, char* p)
 5 {
 6     p = (char*)malloc(len);
 7 }
 8 int main()
 9 {
10     char src[] = "hello,world";
11     char* dest = NULL;
12     char* d = NULL;
13     char* s = NULL;
14     int len = strlen(src);
15     getMemory(len, dest);
16     s = &src[len];
17     while (len-- != 0)
18     {
19         *d++ = *s--;
20     }
21     printf("%s", d);
22     free(d);
23     return 0;
24 }

改正如下:

 1 #include <malloc.h>
 2 #include <stdio.h>
 3 #include <string.h>  //strlen
 4 
 5 void getMemory(int len, char** p)
 6 {
 7     //字符串是以'\0'结尾,所以内存要在原来字符个数len的基础上+1
 8     // 不是二级指针的话,我们知道函数内部创建的非静态局部变量只能在函数调用的时候,才向堆栈申请临时空间这里p=NULL
 9     // 然后malloc把开辟的动态内存空间的起始地址传给p,一旦函数调用完毕,函数调用的栈空间就会被释放
10     // 也就是说调用函数结束后p又为空了,对p=NULL,*P对NULL解引用程序就会崩溃
11     // 
12     // 所以考虑用地址传递,用二级指针来接收指针的地址
13     //这样p存的是指针dest的地址,malloc开辟的动态内存空间的地址就可以直接赋值dest.
14     // 这样函数调用完了,栈区指针变量p被销毁了,但p保存的地址已经获取了动态内存空间 ,也就是说完成了dest =(char*) malloc(len+1)。
15     //然后把malloc开辟内存的其实地址赋给dest
16     *p = (char*)malloc(len+1);
17 }
18 int main()
19 {
20     char src[] = "hello,world";
21     char* dest = NULL;
22     char* d = NULL;
23     char* s = NULL;
24     int len = strlen(src);
25     getMemory(len, &dest);  //二级指针的话,用&取地址
26     //不用getMemory的话,可以直接dest = (char*)malloc(len+1)
27     d = dest; //修改dest里的内容,得用一个指针来确定修改的位置,
28     s = &src[len-1]; //hello,world的有11个字符,下标为0`10,所以下标要比字符个数少1
29     while (len-- != 0)
30     {
31         *d++ = *s--;
32     }
33     *d = '\0';
34     printf("%s", dest);  //要对dest打印,而不是d。
35     free(dest);  //要对dest进行释放,而不是d,因为此时d指向的是'\0'的下一个地址,未知内存,释放未知内存会抛出异常
36     return 0;
37 }

 

标签:char,malloc,NULL,dest,len,改错,逆序,指针
From: https://www.cnblogs.com/py369/p/17780807.html

相关文章

  • 指针小计
    写一小段指针解释代码#include<stdio.h>#include<stdlib.h>intmain(){int*p;p=(int*)malloc(sizeof(int));*p=10;printf("%d",*p);return0;}p=(int*)malloc(sizeof(int));这行代码是用来动态分配内存的。1、malloc函数是C标准库......
  • 通过数组的指针获得数组个数
     这几天学习智能指针时,自己在练习写个管理数组指针的类时碰到了通过数组指针获取数组个数的问题1.在网上查询了通过数组指针获取数组个数的方法,对于自定义数据在前四个节点保存了数组个数Student*pAry=newStudent[3];size_tnum=*((size_t*)pAry-1);//3 测试......
  • 写个简单的管理数组指针的智能指针
    模板智能数组指针1.管理任意类型的数组指针2.释放的时候自动删除数组指针指向的内存//模板智能数组指针template<typenameT>classAiArrayPtr{public:AiArrayPtr(T*pArray){m_pAiPtr=pArray;m_bIsMyPtr=true;//是自己管理的指针......
  • c++指针相关
    常量指针(PointertoConstant)定义:一个指向常量的指针。这意味着指针指向的值不能被修改,但指针本身可以被修改,即可以重新指向其他地址。声明:constType*pointerName;constint*p1;intx=10,y=20;p1=&x;//Valid*p1=50;//Errorp1=&y;//Valid指针......
  • 慎用智能指针的reset方法
    背景使用智能指针指向class的成员变量会导致指针Segmentationfault.复现直接看代码https://godbolt.org/z/Tnx45jraP#include<iostream>#include<memory>structHandler{intnum=7;};intmain(){Handlerhandler;std::shared_ptr<int>ptr=null......
  • c语言指针
    源程序:#include<stdio.h>#include<iostream>#include<stdlib.h>usingnamespacestd;intmain(){ char*p; chara[80]; p=a; inti=0; while((*p=getchar())!='\n') { p++; i++; } a[i]='\0'; for(p=a;*p!='\0......
  • 【C语言基础】指向字符串的指针 & 字符串常量指针的关系
    问:指向字符串的指针与字符串常量指针有什么区别?答:经过实践指向字符串的指针就是字符串常量指针。字符串常量指针是常量指针的一种。常量指针的特点就是不能通过该指针来修改指向内存地址空间存储的值。 问:来看一下常见面试题char*p=“abcd”;*p=‘b’;printf("......
  • 字符逆序改错题,面试中经常遇到,本人已经遇到两次!!
    题目:请找出下面代码的所有错误,说明:一下代码是把一个字符串倒序,如"abcd"倒序为"dcba",以下是引用的代码1#include"string.h"2main()3{4char*pSrc="hello,world";5char*pDest=NULL;6intiLen=strlen(pSrc);7pDest=(char*)......
  • 深入实践C++11智能指针
    目录概念一、std::auto_ptr二、std::unique_ptr常用函数自定义智能指针对象持有的资源的释放函数三、std::shared_ptr常用函数四、std::enable_shared_from_this五、std::weak_ptr常用函数智能指针使用注意事项智能指针的简单实现概念C/C++语言最为人所诟病的特性之一就是......
  • 第 367 场周赛(双指针,集合(upper_bound&lower_bound),前后缀分解)
    2903.找出满足差值条件的下标I2905.找出满足差值条件的下标II这两个题只有数据范围上面的差距 这个题我们大体思路是维护双指针,枚举数字,维护集合。这是灵神视频的代码classSolution:deffindIndices(self,nums:List[int],indexDifference:int,valueDiffere......