c指针问题求解
void func(char *p){
p = (char *)malloc(100);
strcpy(p, "hello ");
}
int main(){
char *str = NULL;
fun(str);
printf( "%s\n ",str);
return 0;
}
运行出现段错误,本人初学c,求各位大侠指点!!!!!
[解决办法]
编译器总是要为函数的每个参数制作临时副本,指针
参数p 的副本是 _p,编译器使 _p = p。如果函数体内的程序修改了_p 的内容,就导致
参数p 的内容作相应的修改。这就是指针可以用作输出参数的原因。在本例中,_p 申请
了新的内存,只是把_p 所指的内存地址改变了,但是p 丝毫未变。所以函数Func()
并不能输出任何东西。事实上,每执行一次func()就会泄露一块内存,因为没有用
free 释放内存。
如果改成下面的则没有问题;
void func(char **p){
*p = (char *)malloc(100);
strcpy(p, "hello ");
}
int main(){
char *str = NULL;
fun(&str);
printf( "%s\n ",str);
return 0;
}
[解决办法]
未发现 fun函数, 而且如果改正了该错误, 输出是(null), 这是因为 在func()函数中, p是一个局部的变量, 函数执行完后, p将被销毁, 形参并不会影响到实参。如果你像这样做:
- C/C++ code
#include <stdio.h>#include <string.h>#include <stdlib.h>char * func(){ char *p = (char *)malloc(100); strcpy(p, "hello "); return p;}int main(){ char *str = NULL; str = func(); printf( "%s\n ",str); return 0;}
[解决办法]
用**或*&
[解决办法]
其实LZ的做法调用func函数时,在函数体内malloc新的地址给了p,实参的值没变,可以先在main函数中,malloc出str的值,然后将其作为实参传入func函数,函数中p就不用再分配地址了
[解决办法]
[解决办法]