首页 新闻 会员 周边 捐助

求教有关strcpy和指针变量的问题

0
悬赏园豆:80 [已解决问题] 解决于 2021-03-09 21:36
#include <stdio.h>
#include <string.h>

char *duplicate(const char *p)
{
    char *q;

    strcpy(q, p);
    return q;
}

int main(void)
{
    char *a;
    char *p = "food fool";

    strcpy(a, p);

    printf("%s\n", duplicate(p));
    printf("%s\n", a);

    return 0;
}

 

为什么strcpy能下面duplicate函数里正常工作,但是同样的模式,放到main函数中就出错了?

如果strcpy(a, p)不正确是因为没有给a分配内存空间,所以不能直接用strcpy的话,那duplicate函数里的q也一样啊,返回的结果却是正确的。这是为什么?

拖拉机夫斯基的主页 拖拉机夫斯基 | 初学一级 | 园豆:130
提问于:2021-03-05 23:15
< >
分享
最佳答案
1

写没有初始化的auto(就是默认的)存储类的变量的行为是undefined

The value of an uninitialized object that has automatic storage duration is used before a value is assigned (3.5.7).

duplicate里的q没有初始化, 可能碰巧就指向了某个可以写的地方.

在我的系统直接调用你的duplicate会出错, 但是这样可以让duplicate里的q碰巧指向某个可以写的地方.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char *duplicate(const char *p)
{
    char *q;

    fprintf(stderr, "q in duplicate: %p\n", q);
    strcpy(q, p);
    return q;
}

char *xduplicate(const char *p)
{
    char *q = malloc(100);
    /* char *xxx = 0; */
    fprintf(stderr, "q in x: %p\n", q);

    return q;
}

int main(void)
{
    char *a;
    char *p = "food fool";

    /* strcpy(a, p); */
    xduplicate(p);

    printf("%s\n", duplicate(p));
    /* printf("%s\n", a); */

    return 0;
}

在我的系统上输出是这样的:

q in x: 0x562da1c122a0
q in duplicate: 0x562da1c122a0
food fool
收获园豆:80
jakio6 | 小虾三级 |园豆:1325 | 2021-03-07 10:39
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册