在一个结构中,scanf返回的是无效地址

我试图打印一个结构的int变量的值,但它打印出的地址,而不是..不知道为什么,这里是代码:


    struct data{
        char name[20];
        int age[100];
    };

    typedef struct data dataobj;

    int main() {
        dataobj element;
        printf("enter a name:n");
        gets(element.name);
        printf("name is: %sn",element.name);
        printf("enter a number:n");
        scanf("%d",&element.age);
        printf("number is: %d",element.age);
        return 0;
    }

这里输出:


    enter a name:
    John
    name is: John
    enter a number:
    30
    number is: 6356352
    Process returned 0 (0x0)   execution time : 7.278 s
    Press any key to continue.

你可以看到它不打印30,而是打印6356352(它应该是element.age var的地址)


我不认为你的意思是将age属性作为100个int的数组; 在你不这样做的情况下,如果你改变你的struct定义为只有一个int

struct data{
    char name[20];
    int age;
};

你提供的代码工作得很好。 如果你想要限制年龄的值,你不会希望使用数组。 使用这样的数组意味着每个dataobj都由一个名称和100个年龄段来描述。 相反,请考虑添加运行时检查,例如:

if (element.age < 0 || element.age > 99) {
    printf("Bad age valuen");
}

不要使用gets ,在C99中不推荐使用,并从C11中删除

相反,使用fgets

char *ptr;

fgets(element.name, sizeof element.name, stdin);
/* Remove the trailing newline */
ptr = strchr(element.name, 'n');
if (ptr != NULL) {
    *ptr = '';
}

age不是一个int而是一个int数组:

struct data{
    char name[20];
    int age[100];
};

更改

scanf("%d",&element.age);
printf("number is: %d",element.age);

scanf("%d",&(element.age[0]));
printf("number is: %d",element.age[0]);

为了读入年龄的第一个元素(坐在索引0处),或者简单地使用简单的int而不是数组


在你的代码中考虑这个声明。

scanf("%d",&element.age);

这里,年龄是数组大小100个整数元素的类型。 因此,在你的记忆中,创建了一系列100个整数,起始元素的地址存储在其他指针变量(int case size)中。 所以,当你正在扫描值时,你正试图操纵你的数组的基地址,这是不可能的。 这属于逻辑错误,只能通过理解来追踪。 所以,只记得一件事。

int age[100]

这是一个声明,其中编译器创建一个指针和100个整型变量(连续的)。 第一个变量的地址存储在指向数组的名称的指针中。

所以,当你试图打印它时,它正在打印基地址数组age [100]。

链接地址: http://www.djcxy.com/p/72197.html

上一篇: in a struct, scanf returns var address not value

下一篇: How do I re enter an integer value in a 'while' loop?