在一个结构中,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