指针作为函数的形参申请内存失败

mac2024-06-02  46

当指针作为函数的形参时,不要用该指针去申请动态内存。网上有下面的例子:

void GetMemory(char *p, int num) {     p = (char *)malloc(sizeof(char) * num); }

void Test(void) {     char *str = NULL;     GetMemory(str, 100); // str 仍然为 NULL     strcpy(str, "hello"); // 运行错误 } 在实际应用中,笔者编写了类似的例子,用形参指针去调用malloc函数,使用gcc编译,编译时不会报错,但是运行时会报段错误,产生段错误的因素很多,但本次运行的段错误确实跟形参指针调用malloc函数有关,当然也不是说形参指针不能调用malloc函数去申请动态内存,只是不能使用上述例子中的方式。

c语言中函数参数传递都是值传递,值传递分为数值传递和指针传递,因此指针传递也是一次赋值拷贝的过程。对于传入的指针参

数 p 来说,编译器会为该参数创建一个临时副本,例如 _p。函数体中只是修改了形参_p的内容,对于实参p没有任何影响。

如果想要在调用函数中申请内存,笔者在网上找到了两种方式:

1. 双重指针

void GetMemory(char **p, int num) {     *p = (char *)malloc(sizeof(char) * num); }

void Test(void) {     char *str = NULL;     GetMemory(&str, 100); //注意是&str     strcpy(str, "hello");

     free(str);

}

2.参数返回申请的内存

char * GetMemory( int num) {     char *p = (char *)malloc(sizeof(char) * num);

     return p; }

void Test(void) {     char *str = NULL;     str = GetMemory(100); //注意是&str     strcpy(str, "hello");

     free(str);

}

对于笔者来说,只有第二种方式解决了问题,使用第一种方式仍然会出错。

最新回复(0)