使用指针打印结构时应用程序崩溃

时间:2016-11-28 14:12:06

标签: c arrays pointers mingw structure

我在下面编写了使用指针读取/打印结构的代码。应用程序正在打印数据,但后来崩溃了。在某处似乎是一些愚蠢的错误。无法找到确切的问题。我尝试在printStruct中使用pass by value并在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);
}

1 个答案:

答案 0 :(得分:1)

首先,uint8_t *不是%d的{​​{1}}格式说明符的有效参数类型。使用错误类型的参数会调用undefined behavior

之后,从技术上讲,scanf()再次是未定义的行为,don't do it

第三,DO NOT use gets(), it is dangerous由于容易发生缓冲区溢出。请改用fgets()

修复所有问题(或者更确切地说,是编译器尖叫的警告消息,并运行代码。)