Struct 尝试打印指针结构的部分时出现分段错误

Struct 尝试打印指针结构的部分时出现分段错误,struct,fault,Struct,Fault,我正在编写一个程序,它必须接受用户输入,才能为结构的各个部分赋值。我需要创建一个指向结构的指针,该指针将作为函数的唯一参数传递,该函数将单独打印结构的每个部分。我还必须为结构使用malloc内存。现在,程序编译并运行main,并向用户请求输入。在收集最后一个用户输入之后,并且我假设对printContents函数的调用已运行时,会发生分段错误。任何帮助都将不胜感激 #include <stdio.h> #include <stdlib.h> struct info {

我正在编写一个程序,它必须接受用户输入,才能为结构的各个部分赋值。我需要创建一个指向结构的指针,该指针将作为函数的唯一参数传递,该函数将单独打印结构的每个部分。我还必须为结构使用malloc内存。现在,程序编译并运行main,并向用户请求输入。在收集最后一个用户输入之后,并且我假设对printContents函数的调用已运行时,会发生分段错误。任何帮助都将不胜感激

#include <stdio.h>
#include <stdlib.h>

struct info
{
        char name[100], type;
        int size;
        long int stamp;
};

void printContents(struct info *iptr);

int main(void)
{
        struct info *ptr=malloc(sizeof(struct info));

                printf("Enter the type: \n");
                scanf("%c", &(*ptr).type);
                printf("Enter the filename: \n");
                scanf("%s", (*ptr).name);
                printf("Enter the access time: \n");
                scanf("%d", &(*ptr).stamp);
                printf("Enter the size: \n");
                scanf("%d", &(*ptr).size);

        printf("%c", (*ptr).type);

        printContents(ptr);

}

void printContents(struct info *iptr)
{

        printf("Filename %s Size %d Type[%s] Accessed @ %d \n", (*iptr).name, (*iptr).size, (*iptr).type, (*iptr).stamp);

}
#包括
#包括
结构信息
{
字符名[100],类型;
整数大小;
长整型邮票;
};
无效打印内容(结构信息*iptr);
内部主(空)
{
结构信息*ptr=malloc(sizeof(结构信息));
printf(“输入类型:\n”);
scanf(“%c”和(*ptr).type);
printf(“输入文件名:\n”);
scanf(“%s”,(*ptr.name);
printf(“输入访问时间:\n”);
scanf(“%d”和(*ptr).stamp);
printf(“输入大小:\n”);
扫描频率(“%d”和(*ptr).size);
printf(“%c”,(*ptr).type);
印刷内容(ptr);
}
无效打印内容(结构信息*iptr)
{
printf(“文件名%s大小%d类型[%s]已访问@%d\n”,(*iptr).name,(*iptr).Size,(*iptr).Type,(*iptr).stamp);
}

ptr->成员就像访问结构变量一样,对吗?同样,scanf()usr&ptr->member也可以获得值。对于字符输入,只使用ptr->charmember。

检查运算符优先级。这是你想做的事吗?也许
&(*ptr.type)

首先,让我们用艰难的方式来做。我们将假设代码已经编写,编译器没有告诉我们任何有用的信息,并且我们没有调试器。首先,我们输入一些诊断输出语句,发现崩溃发生在
printContents

printf("testing four\n"); /* we see this, so the program gets this far */
printf("Filename %s Size %d Type[%s] Accessed @ %d \n", (*iptr).name, (*iptr).size, (*iptr).type, (*iptr).stamp);
printf("testing five\n"); /* the program crashes before this */
如果我们仍然看不到bug,我们可以通过准备一个。(这是一项非常有价值的技能。)我们一遍又一遍地编译和运行代码,并给出注释。当我们注释掉某些东西,代码仍然存在错误时,我们会将其完全删除;但是如果把它评论出来让问题消失了,我们就把它放回去。最终,我们将讨论一个最小的案例:

#include <stdio.h>

int main(void)
{
  char type;

  type = 'a';

  printf("Type[%s]\n", type);
}
将来,有一种方法可以帮你省去所有的麻烦。您不需要编写大量代码,也不需要获得神秘的bug和回溯,而是可以以小增量编写。如果您一次在
printf
语句中添加一个术语,那么您就可以准确地看到错误出现的时间,以及应该归咎于哪个术语


请记住:从小处做起,简单一点,一次增加一点复杂性,每一步都要进行测试,永远不要添加不起作用的代码。

编辑代码以纠正编译警告后,它会毫无错误地运行。编译器是你的朋友。你编辑什么代码?它对我来说很好?我可以运行程序,然后在收集用户输入后,出现分段错误。我正在尝试将值存储到结构中,并创建指向它的指针。我应该在scanf中根本不使用指针吗?我不确定如何创建指向结构的指针。请参阅Beta的回复。他找到了原因。这个问题与优先级无关,很抱歉误导了您。问题是您使用的是
%s
字符变量
type
的位置。因此,程序将
type
的值作为字符串的基址,由于该值介于0和255之间,程序尝试访问介于0和255之间的内存地址,因此出现错误。您应该将
打印内容中的
类型[%s]
替换为
类型[%c]
gcc foo.c -o foo
foo.c:35: warning: format ‘%s’ expects type ‘char *’, but argument 4 has type ‘int’