#include"stdio.h"
#include"stdlib.h"
#include"string.h"
void getMem(int* p)
{
p=(int*)malloc(sizeof(int));
*p=5;
}
int main(void)
{
int a=1;
int* p1=&a;
getMem(p1);
printf("a=%d\n",a);
return 0;
}
代码的本意是:定义指针变量p1,p1指向main函数中的变量a,通过调用getMem函数给变量a通过传址的方式改变实参a的值,改为5,但输出的结果为1,说明变量a的值并没有改变。原因在于错误地使用了malloc。
【更改】:
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
void getMem(int* p)
{
// p=(int*)malloc(sizeof(int));
需要屏蔽掉上面这句话,因为这里把参数传递进来之后,传递进来的是main函数中a的地址,但是这个语句又让指针变量p指向了一个新开辟的空间,p已经不再指向a了,所以下面*p=5起到的作用只是把malloc出来的那块内存空间赋值为5,但此时p中存放的已经不再是a的地址了。
*p=5;
}
int main(void)
{
int a=1;
int* p1=&a;
getMem(p1);
printf("a=%d\n",a);
return 0;
}
再看一个例子,涉及到传址和传值,以及malloc,二级指针
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
void getMemory(char* *p)
{
*p=(char*)malloc(15);
}
int main(void)
{
char* str =NULL;
getMemory(&str);
通过调用没有返回值的函数来改变实参str的值,应该将str的指针作为函数的参数,这个函数参数肯定应该是指针类型的(几级指针尚且不论)
通过调用没有返回值的函数,就要改变实参的值,应该使用传址的方式。
因为str本身就是一个指针,所以*str是一个二级指针。
strcpy(str,"hello");
printf("%s",str);
return 0;
}