我正在尝试了解如何使用struct

时间:2020-04-03 21:57:50

标签: c struct typedef

这里有一段我​​正在玩的代码片段,以了解结构体中的字符。

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没有方括号来为字符数组分配内存,我必须放置'&'符号来运行它而不会收到警告。 我注意到此代码输出的内容与上述代码段相同。

我想声明一个字符串,也需要声明一个数组的大小。

我在这里不明白什么?

1 个答案:

答案 0 :(得分:0)

首先,您的代码工作不足以证明它是正确的。

在第二个代码段中,purchase_location不是字符串或字符数组,它只是一个字符。 您没有得到任何警告的原因是因为scanf仅需要一个地址。将&放在变量名之前时,它仅给出变量的地址(scanf可用于存储用户输入值)。现在,当涉及数组时,不带任何方括号或索引的数组名称只是给出数组第一个元素的地址,以使其清晰可见:

假设我们有一个char a[10],a将给出数组的第一个元素的地址,a[0]将给出数组的第一个元素的值,如果您关注以下内容,您将知道&a[0]将再次给出数组第一个元素的地址。如果我们有一个char b,则&b是char变量的地址。现在,对于scanf&ba都是两个char变量的地址,但实际上,它们是完全不同的,

如果您通过提及scanf告诉%s,您期望一个字符串,那么它将采用您输入的字符并将其放在给定的地址,就是这样。我相信,在您的情况下,您很幸运能够拥有这个空间。

如果您告诉printf变量是一个字符串变量,并给它一个地址,它将只占用该部分内存中的所有可用字符。

这两个原因可能是您既未收到任何警告,也未在输出中发现错误的原因。在另一种情况下,该空间可能不可用,或者更糟的是,您可能会覆盖其他数据。

相关问题