#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也一样啊,返回的结果却是正确的。这是为什么?
写没有初始化的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