Chinaunix

标题: 请教:该程序为什么输出为空? [打印本页]

作者: lovebible    时间: 2007-09-01 21:20
标题: 请教:该程序为什么输出为空?
程序如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int
main(void)
{
    char *p1="name";
    char *p2;

    p2 = (char*)malloc(20);
    memset (p2, 0, 20);
    while(*p2++ = *p1++);
    printf("%s\n", p2);
    return 0;

}

作者: lovebible    时间: 2007-09-01 21:32
等待答案阿,
作者: zwylinux    时间: 2007-09-01 21:33
循环结束后p2指向哪里?
作者: chinesedragon    时间: 2007-09-01 21:37
while结束后,p2指向下一个0,当然输出为空了~
作者: lovebible    时间: 2007-09-01 21:38
楼上的意思是循环后p2指向'\0'了吗?
但是strcpy函数也是这么写的阿
作者: ypxing    时间: 2007-09-01 21:41
需要一个临时变量保存p2先

原帖由 lovebible 于 2007-9-1 21:38 发表
楼上的意思是循环后p2指向'\0'了吗?
但是strcpy函数也是这么写的阿

作者: lovebible    时间: 2007-09-01 21:43
K&R C中写的一个strcpy的实现
void strcpy(char *s, char *t)
{
     while(*s++ = *t++))
           ;
}

和这个写法一样阿,这个s难道也指向0了?
作者: ypxing    时间: 2007-09-01 21:48
你要是把printf放在里面的话,也会这样的
函数外面printf就不一样了

原帖由 lovebible 于 2007-9-1 21:43 发表
K&R C中写的一个strcpy的实现
void strcpy(char *s, char *t)
{
     while(*s++ = *t++))
           ;
}

和这个写法一样阿,这个s难道也指向0了?

作者: lovebible    时间: 2007-09-01 22:03
楼上的说的太对了,就是这样。

请问是不是相当于从外面在访问这个p2指针时,它就指向字符串的开头了,这是为什么阿,谢谢
作者: ypxing    时间: 2007-09-01 22:13
你应该去看看指针是什么,函数是怎样传递参数的

原帖由 lovebible 于 2007-9-1 22:03 发表
楼上的说的太对了,就是这样。

请问是不是相当于从外面在访问这个p2指针时,它就指向字符串的开头了,这是为什么阿,谢谢

作者: ken2642    时间: 2007-09-01 22:22
其实是因为传进去的是指针的副本,所以在外面print就可以了
作者: chinesedragon    时间: 2007-09-01 22:26
原帖由 lovebible 于 2007-9-1 22:03 发表
楼上的说的太对了,就是这样。

请问是不是相当于从外面在访问这个p2指针时,它就指向字符串的开头了,这是为什么阿,谢谢

p1,p2是临时变量,函数调用结束后就消失了,实参是一直指向内存的首地址的~
作者: swordfish.cn    时间: 2007-09-01 23:51


基本的东西要搞清




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2