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

代码:如下

 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 }

 

posted @ 2023-10-22 18:21  潘阳399  阅读(24)  评论(0编辑  收藏  举报