这里有一段我正在玩的代码片段,以了解结构体中的字符。
typedef struct{
int mpg;
int wheels;
char owner[20];
}desc_t;
typedef struct{
int price;
char purchase_location[20];
desc_t desc;
}car_t;
int main(void)
{
car_t car;
printf("enter car purchase location: ");
scanf("%s", car.purchase_location);
printf("enter car owner: ");
scanf("%s", car.desc.owner);
}
在两个结构中的,owner和purchase_location都存储在一个字符数组中,因此在打印时不要使用'&'符号是有意义的。
但是..
typedef struct{
int mpg;
int wheels;
char owner;
}desc_t;
typedef struct{
int price;
char purchase_location;
desc_t desc;
}car_t;
int main(void)
{
car_t car;
printf("enter car purchase location: ");
scanf("%s", &car.purchase_location);
printf("enter car owner: ");
scanf("%s", &car.desc.owner);
}
在此版本中,Owner和purchase_location没有方括号来为字符数组分配内存,我必须放置'&'符号来运行它而不会收到警告。 我注意到此代码输出的内容与上述代码段相同。
我想声明一个字符串,也需要声明一个数组的大小。
我在这里不明白什么?
答案 0 :(得分:0)
首先,您的代码工作不足以证明它是正确的。
在第二个代码段中,purchase_location
不是字符串或字符数组,它只是一个字符。
您没有得到任何警告的原因是因为scanf
仅需要一个地址。将&
放在变量名之前时,它仅给出变量的地址(scanf
可用于存储用户输入值)。现在,当涉及数组时,不带任何方括号或索引的数组名称只是给出数组第一个元素的地址,以使其清晰可见:
假设我们有一个char a[10]
,a将给出数组的第一个元素的地址,a[0]
将给出数组的第一个元素的值,如果您关注以下内容,您将知道&a[0]
将再次给出数组第一个元素的地址。如果我们有一个char b
,则&b
是char变量的地址。现在,对于scanf
,&b
和a
都是两个char变量的地址,但实际上,它们是完全不同的,
如果您通过提及scanf
告诉%s
,您期望一个字符串,那么它将采用您输入的字符并将其放在给定的地址,就是这样。我相信,在您的情况下,您很幸运能够拥有这个空间。
如果您告诉printf
变量是一个字符串变量,并给它一个地址,它将只占用该部分内存中的所有可用字符。
这两个原因可能是您既未收到任何警告,也未在输出中发现错误的原因。在另一种情况下,该空间可能不可用,或者更糟的是,您可能会覆盖其他数据。