【问题标题】:Application Crash when printing structure using pointer使用指针打印结构时应用程序崩溃
【发布时间】:2016-11-28 14:12:05
【问题描述】:

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

【问题讨论】:

    标签: c arrays pointers mingw structure


    【解决方案1】:

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

    在那之后,从技术上讲,fflush(stdin); 又是未定义的行为,don't do it

    第三,DO NOT use gets(), it is dangerous 因为缓冲区很容易溢出。请改用fgets()

    修复所有问题(或者更确切地说,是编译器大声抱怨的警告消息),然后运行代码。

    【讨论】:

    • 在解决除 fflush() 之外的问题后,它工作正常。但我的问题是:为什么会有 get() 和 fflush() 如果它们不起作用?怎么知道这些问题?如果我们不使用 fflush,scanf 也会带来麻烦。我真的很困惑哪个是从标准输入读取的最佳方式?另外如何读取 uint8_t 的数据?假设我不想选择 int 或 short int。
    • 无符号字符的格式说明符怎么样?我不认为它在那里。我们如何在不使用 %c 的情况下读取 8 位值?我还在某处读到 uint8_t、uint16_t 等是声明变量的标准方式,因为它们独立于架构。任何cmets!
    • @Rajesh 我已经删除了之前的评论,这可能会产生误导。关键是,scanf() 没有为uint&lt;N&gt;_t 类型定义格式说明符,相反,您应该使用标准中指定的SCNuN MACRO。你需要&lt;inttypes.h&gt; 来做这件事。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-07
    • 1970-01-01
    • 2021-11-07
    • 1970-01-01
    • 1970-01-01
    • 2013-09-28
    • 1970-01-01
    相关资源
    最近更新 更多