我正试图了解如何使用struct

问题描述 投票:0回答:1

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

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

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

我在这里不明白什么?

c struct typedef
1个回答
0
投票

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

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

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.