Chinaunix首页 | 论坛 | 博客
  • 博客访问: 444616
  • 博文数量: 72
  • 博客积分: 3186
  • 博客等级: 中校
  • 技术积分: 1039
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-07 16:53
文章分类

全部博文(72)

文章存档

2012年(1)

2011年(5)

2010年(10)

2009年(56)

我的朋友

分类: C/C++

2009-03-16 20:27:10

前些天面试的时候这道题做错了,面试我的大哥当时给我讲了这题,当时就是“哦哦哦……”的点头,可能由于当时也太紧张,他说什么我也忘了,后来把这题写下来看了很久,感谢etual大哥的热心,最后这题按面试那位大哥的说法我还是有些问题,现记录如下:
 

void Getmemery(char *p)
{
    p=(char *)malloc(100);

}
void main()
{
    char *str=NULL;

    Getmemery(str);
    strcpy(str,"hello world");

    printf("%s\n",str);

}

题目的意思是要输出 hello world,但是程序里写的有问题。

Getmemery里分配内存空间后,将首地址指给p,即经过函数参数的传递,在Getmemery函数体内有srt的值为这段内存的首地址,但这个值并未返回回来,所以在main函数内,

strcpy(str,"hello world");

这一句str的值仍是0,即其指向的是0开始的内存,而分配的那段内存不知去向。这就肯定得不到想要的结果。

可修改程序如下:

 

void *Getmemery(void)
{
    char *p;
    p=(char *)malloc(100);
    return p;
}
void main()
{
    char *str=NULL;
    str = Getmemery();    
    strcpy(str,"hello world");
    printf("%s",str);
    free(str);
    getch();
}

这样通过指针的传递,str就指向了分配的那段内存。结果正确。

关于以上的问题还可以分析如下程序:

void exchange(int *x,int *y)
{
    int *z;
    z=x;
    x=y;
    y=z;
}

void main()
{
    int c=2,d=3;

    int *a=&c;
    int *b=&d;

    printf("\nbefore:a=%d,b=%d",*a,*b);
    exchange(a,b);
    printf("\nafter:a=%d,b=%d",*a,*b);
}
程序输出结果为:a=2,b=3

              a=2,b=3

exchange函数内确实交换了指针x,y的指向,但这个结果是没能返回的,a和b还是没有改变。即a和b是一直指向原来的值的。

 

当时面试的大哥给我讲的是将Getmemery内改成**p,即程序如下:

void Getmemery(char **p)
{
    p=(char *)malloc(100);
}
void main()
{
    char *str=NULL;
    Getmemery(str);
    strcpy(str,"hello world");
    printf("%s\n",str);
    getch();
}

但是这样运行得不到想要的结果,若在其中插入一行,即换成如下程序:

 

void Getmemery(char **p)
{
    p=(char *)malloc(100);
}
void main()
{
    char *str=NULL;
    Getmemery(str);
    strcpy(str,"hello world");
     printf("%d\n",str);

    printf("%c%c%c%c%c%c%c%c%c%c%c\n",*str,*(str+1),*(str+2),*(str+3),*(str+4),*(str+5),*(str+6),*(str+7),*(str+8),*(str+9),*(str+10));

    getch();
}

可得到结果:0

          hello world

猜测:str还是在0的地址上,字符串hello world复制到了0开始往下的一段内存中。

printf("%d\n",str);不能输出hello world,还不知道原因。反正果这样的话,str指针指乱了,hello world复制到了一段不希望的内存上,会出问题的。记下问题,以后功力深了再分析……

阅读(2011) | 评论(3) | 转发(0) |
给主人留下些什么吧!~~

changyongid2009-03-26 14:37:27

多谢楼上两位,应该是我记错了。主要原因是我对指针这边还是理解不深入,我继续加强内功的。

wanwiy2009-03-21 22:46:12

同意楼上的,建议你看林博士的高质量编程,上面讲的非常清楚

luciamobile2009-03-18 10:05:44

这位兄弟不用那么麻烦的 void Getmemery(char **p) { *p=(char *)malloc(100); } void main() { char *str=NULL; Getmemery(&str); strcpy(str,"hello world"); printf("%s\n",str); getch(); } 不知道你是不是记错面试的人给你讲解的东西。呵呵