函数传递动态内存

问题

1
2
3
4
5
6
7
8
9
10
11
void GetMemory(char *p, int num)
{
p = (char *)malloc(sizeof(char) * num);
}

int main()
{
char* str = NULL;
GetMemory(str, 10);
return 0;
}

运行时报错 str 为 NULL。
函数中的参数p是复制原有指针的值,而不是原来的指针,所以即使p重新指向新的地址,但原来的指针指向的地址仍然不变。

解决

应该采用二级指针。传递str的地址给函数。

1
2
3
4
5
6
7
8
9
10
11
void GetMemory(char **p, int num)
{
*p = (char *)malloc(sizeof(char) * num);
}

int main()
{
char* str = NULL;
GetMemory(&str, 10);
return 0;
}

或者可以改成用函数返回值来传递动态内存。

1
2
3
4
5
6
7
8
9
10
11
12
char* GetMemory(char *p, int num)
{
p = (char *)malloc(sizeof(char) * num);
return p;
}

int main()
{
char* str = NULL;
str = GetMemory(str, 10);
return 0;
}