首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

c指针有关问题求解

2012-03-24 
c指针问题求解voidfunc(char*p){p(char*)malloc(100)strcpy(p, hello )}intmain(){char*strNULLfun

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()就会泄露一块内存,因为没有用……

热点排行