【问题标题】:How to input value from user using structure pointer and display the value of structure members?如何使用结构指针从用户输入值并显示结构成员的值?
【发布时间】:2016-03-09 17:19:11
【问题描述】:
#include<stdio.h>
#include<string.h>

struct employee
{
   int id;
   char name[20];
   float salary;
   char addr[];   
}*emp;

void get_emp(struct employee **record)
{

   printf("\tplease enter details of employee:\n");

   printf("id= ");
    scanf("%d",(*record)->id);//code to get input value

   printf("Name= ");
   scanf(" %s",(*record)->name);

   printf("salary= ");
   scanf("%f",(*record)->salary);


}

int main()
{
get_emp(&emp);
printf("id=%d\n",emp->id); // code to display the value
printf("Name=%s\n",emp->name);
printf("salary=%f\n",emp->salary);


return 0;
}

我有一个结构示例,我想将结构指针传递给函数,而不使用普通变量,而只使用指针。函数 get_emp(struct employee **record) 中的参数(双指针)是否是正确的方法,如果不应该进行哪些更改?另外如何在get_emp(struct employee **record)函数中获取用户的输入值以及如何显示该值?

【问题讨论】:

  • 你还没有编译和运行这段代码有你。您正在取消引用一个空指针:emp 被初始化为 NULL(静态存储),它是一个指针。你没有在任何地方为结构分配内存,所以(*record)-&gt;id就像写(NULL)-&gt;id,这当然是错误的
  • 我已经编译,代码没有任何问题。每当我尝试输入时,它就会停止工作并退出程序。

标签: c pointers structure


【解决方案1】:

不需要双指针。您也可以使用单指针来完成此操作。但是,您需要在填充结构之前为其分配内存。

struct employee *emp = malloc(sizeof(struct employee));

您的结构中char addr[] 的大小也是未定义的。这需要单独分配,类似于:

emp-&gt;addr = malloc(N*sizeof(*emp-&gt;addr));

结构中所有其他具有固定大小的字段,例如整数、浮点数和 20 个元素的字符数组,不需要分配。它们的分配将由我们之前所做的 malloc 完成。但是,由于addr 是一个指针,因此将为它保留与指针大小相等的内存。要在addr 指向的地址中存储任何内容,我们需要进行分配。

然后将 emp 传递给您的函数。去掉双指针

【讨论】:

  • 不要转换malloc的返回值。另外:sizeof(char) 保证为 1,添加它没有意义。分配内存的首选方法是:some_ptr = malloc(N * sizeof *some_ptr); 因为它会做它应该做的事情,所以总是:malloc N 倍于 some_ptr 指向的类型的大小。 some_ptr 可以更改类型,malloc 调用仍然有效。无论您处理的间接级别如何,使用sizeof *destination_ptr总是工作
  • 谢谢。我会改正的。这是一个非常有益的建议
  • 感谢 sharad 和 elias。这完全是关于结构指针的内存分配。什么是作为 scanf("%d",(*record)->id) , scanf("%d",&record->id) 输入的好代码scanf("%d",record->id) 一切正常。
  • 如果你使用的是单指针那么 scanf("%d",&record->id) 是正确的
猜你喜欢
  • 2013-04-13
  • 2010-11-18
  • 1970-01-01
  • 1970-01-01
  • 2013-10-07
  • 1970-01-01
  • 1970-01-01
  • 2020-05-02
  • 1970-01-01
相关资源
最近更新 更多