字符串逆序输出改错(二)(二级指针)
代码:如下
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 }