使用指针打印结构时应用程序崩溃
Application Crash when printing structure using pointer
我使用指针为 reading/printing 结构编写了以下代码。该应用程序正在打印数据,但后来崩溃了。似乎在某处出现了一些愚蠢的错误。无法找到确切的问题。我尝试在 printStruct 中使用按值传递并在 readStruct 中使用返回结构。没有问题。当我使用指针时不确定出了什么问题。
#include<stdio.h>
#include <inttypes.h>
#include <string.h>
struct student{
char USN[10];
char name[50];
char gender;
uint8_t age;
};
void printStruct (struct student*);
void readStruct(struct student*);
int main() {
uint8_t numStudents;
printf("Enter number of students\n");
scanf("%d",&numStudents);
struct student firstSemStudent[numStudents];
readStruct(firstSemStudent+0);
printStruct(firstSemStudent+0);
return 0;
}
void printStruct (struct student *var1)
{
printf("USN= %s\n",var1->USN);
printf("Name = %s\n",var1->name);
printf("Age = %d\n",var1->age);
printf("Gender = %c\n",var1->gender);
}
void readStruct(struct student *temp)
{
printf("\nEnter USN: ");
fflush(stdin);
gets(temp->USN);
printf("\nEnter Name: ");
fflush(stdin);
gets(temp->name);
printf("\nEnter age\n");
scanf("%d",&temp->age);
printf("\nEnter the Gender as M/F");
fflush(stdin);
scanf("%c",&temp->gender);
}
首先,uint8_t *
不是 scanf()
的 %d
格式说明符的有效参数类型。使用错误类型的参数调用 undefined behavior.
在那之后,从技术上讲,fflush(stdin);
又是未定义的行为,。
第三,DO NOT use gets()
, it is dangerous due to easy possibility of buffer overrun. use fgets()
代替。
修复所有问题(或者更确切地说,您的编译器尖叫抱怨的警告消息)和 运行 代码。
我使用指针为 reading/printing 结构编写了以下代码。该应用程序正在打印数据,但后来崩溃了。似乎在某处出现了一些愚蠢的错误。无法找到确切的问题。我尝试在 printStruct 中使用按值传递并在 readStruct 中使用返回结构。没有问题。当我使用指针时不确定出了什么问题。
#include<stdio.h>
#include <inttypes.h>
#include <string.h>
struct student{
char USN[10];
char name[50];
char gender;
uint8_t age;
};
void printStruct (struct student*);
void readStruct(struct student*);
int main() {
uint8_t numStudents;
printf("Enter number of students\n");
scanf("%d",&numStudents);
struct student firstSemStudent[numStudents];
readStruct(firstSemStudent+0);
printStruct(firstSemStudent+0);
return 0;
}
void printStruct (struct student *var1)
{
printf("USN= %s\n",var1->USN);
printf("Name = %s\n",var1->name);
printf("Age = %d\n",var1->age);
printf("Gender = %c\n",var1->gender);
}
void readStruct(struct student *temp)
{
printf("\nEnter USN: ");
fflush(stdin);
gets(temp->USN);
printf("\nEnter Name: ");
fflush(stdin);
gets(temp->name);
printf("\nEnter age\n");
scanf("%d",&temp->age);
printf("\nEnter the Gender as M/F");
fflush(stdin);
scanf("%c",&temp->gender);
}
首先,uint8_t *
不是 scanf()
的 %d
格式说明符的有效参数类型。使用错误类型的参数调用 undefined behavior.
在那之后,从技术上讲,fflush(stdin);
又是未定义的行为,
第三,DO NOT use gets()
, it is dangerous due to easy possibility of buffer overrun. use fgets()
代替。
修复所有问题(或者更确切地说,您的编译器尖叫抱怨的警告消息)和 运行 代码。