最近有一个问题引起了关于数组和指针的讨论。该问题是关于scanf("%s", &name)
与scanf("%s", name)
的区别。
对于下面的代码,在VS2010中(或者早期版本),微软实际上已经为您解决了这个问题,
#include <stdio.h>
int main()
{
char name[30];
printf("Scan \"name\" - ");
scanf("%s", name);
printf("Print \"&name\" - %s\n", &name);
printf("Print \"name\" - %s\n", name);
printf("Pointer to &name - %p\n", &name);
printf("Pointer to name - %p\n", name);
printf("\n\n");
printf("Scan \"&name\" - ");
scanf("%s", &name);
printf("Print \"&name\" - %s\n", &name);
printf("Print \"name\" - %s\n", name);
printf("Pointer to &name - %p\n", &name);
printf("Pointer to name - %p\n", name);
return 0;
}
这个在ANSI C标准中有明确定义吗?还是允许与编译器相关?这是否有效,因为MS将所有内容视为C++?暂时请忽略缓冲区溢出问题。
char*
,因此&name
是错误的,但我无法想象这会导致问题,特别是在编译 x86/x64 时。 - James McNellis&name
会导致未定义的行为?%s
需要一个参数,它是“指向字符数组初始元素的指针...”。无论name
还是&name
都可以做到这一点,即使它们具有不同的类型。 - Michael Burr