读书人

c指针有关问题求解

发布时间: 2012-03-24 14:00:46 作者: rapoo

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就不用再分配地址了
[解决办法]
探讨
void func(char *p){
p = (char *)malloc(100);
strcpy(p, "hello ");
}

int main(){
char *str = NULL;
fun(str);
printf( "%s\n ",str);
……

[解决办法]
探讨

编译器总是要为函数的每个参数制作临时副本,指针
参数p 的副本是 _p,编译器使 _p = p。如果函数体内的程序修改了_p 的内容,就导致
参数p 的内容作相应的修改。这就是指针可以用作输出参数的原因。在本例中,_p 申请
了新的内存,只是把_p 所指的内存地址改变了,但是p 丝毫未变。所以函数Func()
并不能输出任何东西。事实上,每执行一次func()就会泄露一块内存,因为没有用……

读书人网 >C语言

热点推荐