我已经编写了以下代码,但我不明白它是如何运作的。
#include "stdio.h"
typedef struct {
char s[100];
} MyStruct;
void teste(MyStruct *mS) {
scanf("%s", mS->s);
printf("%s\n", mS->s);
scanf("%s", &(mS->s));
printf("%s\n", mS->s);
printf("%p\n", mS->s);
printf("%p\n", &(mS->s));
}
int main(void) {
MyStruct a;
teste(&a);
return(0);
}
编译时,我得到(预期)警告:
gut.c: In function ‘teste’:
gut.c:11:8: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘char (*)[100]’ [-Wformat=]
scanf("%s", &(mS->s));
但是,当我运行代码时,mS->s
和&(mS->s)
表现得与他们相等!
aaa
aaa
bbb
bbb
0x7ffc0fab39c0
0x7ffc0fab39c0
指针和它的解除引用版本实际上都是相同的!这是怎么发生的?这是未定义的行为吗?我使用的是GCC 5.3.1,唯一的标志是-Wall
。
提前多多感谢!