今天在学习动态内存管理的时候,遇到下面的代码,发现可以对标题问题有更深刻的理解
下面给出代码(有问题的代码,这是一道面试题)
#include <stdlib.h>
void GetMemory(char* p)
{
p = (char*)malloc(100);
}
void Test(void)
{
char* str = NULL;
GetMemory(str);
strcpy(str, "hello world");
printf(str);
}
int main()
{
Test();
return 0;
}
先给出结论,想要通过函数修改某个变量的值,都是传入该变量的地址(实参),然后函数参数(形参)是比变量更高一级的指针。
在此之前,我所遇到的都是传入的变量都是类似 int, char等(实参),然后函数参数即取出它们的地址(形参,一级指针)。
上述代码中,想要通过GetMemory函数修改str(一级指针),所以应该传入 &str
同时,GetMemory函数参数应该是二级指针。下面给出修改后的代码
#include <stdlib.h>
void GetMemory(char** p)
{
*p = (char*)malloc(100);
}
void Test(void)
{
char* str = NULL;
GetMemory(&str);
strcpy(str, "hello world");
printf(str);//printf("hello world");
//释放
free(str);
str = NULL;
}
int main()
{
Test();
return 0;
}
printf(str); 对于这一行,我也是第一次见,printf() 里面放了个一级指针
//printf("hello world"); 本质上是传入"hello word" 的首字符地址
C 库函数 int printf(const char *format, ...) 发送格式化输出到标准输出 stdout。
char* GetMemory(void)
{
char p[] = "hello world";
return p;
}
void test(void)
{
char* str = NULL;
str = GetMemory();
printf(str);
}
int main()
{
test();
return 0;
}
GetMemory函数调用结束后,p[]数组就被释放掉了,返回的p指针就变成了野指针(因为此时p指向的很可能已经被覆盖掉了)
只需修改char p[] 为 char* p,因为字符串"hello world"是字符串常量,是不可修改的。
char* GetMemory(void)
{
char* p = "hello world";//将数组改为指针
return p;
}
void test(void)
{
char* str = NULL;
str = GetMemory();
printf(str);
}
int main()
{
test();
return 0;
}