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