关于在函数内部修改指针内容的问题
1. 问题阐述
#include<stdio.h>
void fun(int* p) {
p = (int*)malloc(sizeof(int));
}
int main() {
int* t=NULL;
fun(&t);
return 0;
}
在上面代码中的问题就是:将t的地址作为参数传入函数中,在执行了函数内部的操作后,t仍然是空值。
而出现这个问题的原因是:在函数参数传递的过程中,只是将t的副本传入函数,实际上t未被改变。
2.问题解决
1. 通过返回值传递分配的内存
在函数内部使用 malloc
或者其他分配内存的函数分配内存空间,并在函数结束前返回该内存指针。在函数外部,将返回的指针 赋值给一个变量,就可以在函数外部使用分配的内存。
// 函数内部分配内存,并返回分配的内存指针
int* fun() {
int* p = (int*)malloc(sizeof(int));
return p;
}
int main() {
int* t = fun(); // 在函数外部使用函数内部分配的内存
return 0;
}
用图来表示逻辑关系:
2. 通过指针参数传递分配的内存
在函数外部定义一个指针,将其地址作为参数传递给函数。在函数内部,通过指针参数将分配的内存指针赋值给函数外部定义的指针。这样,在函数外部就可以通过该指针访问函数内部分配的内存。
// 函数内部分配内存,并将分配的内存指针赋值给函数外部的指针
void fun(int** p) {
*p = (int*)malloc(sizeof(int));
}
int main() {
int* t;
fun(&t); // 在函数外部使用函数内部分配的内存
return 0;
}
用图来表示逻辑关系:
3. 关于双重指针补充知识
以char** p为例:
首先要知道 ‘ * ’ 运算符的结合性是从右往左,因此,**p相当于 *( p)。前面的char表示p指向的是char *型的数据,后面的( *p)表示p是个指针变量。
总的来说,p指向一个char指针变量(而这个char型指针变量指向一个char型数据)*p指的是p所指向的char指针变量的值(这个值往往是char型数据的地址)