c - 两个不同函数中相同结构对象的变量地址不同

标签 c

我有两个函数,一个是 main,另一个是使用结构显示我初始化了变量 id 和 name,以及当我显示值时。 main函数和display函数中的值是不同的。

#include<stdio.h>
#include<conio.h>

struct Person
{
  int id;
  char name[];

};

void display(struct Person p)
{
  printf("\n\n value: \n Id is : %d   And name is: %s  \n ",p.id,p.name);
   printf("Address: \nThe addres in  function of id is %p and name  is %p \n .........  \n",&(p.id),&(p.name));
}

void main()
{
  struct Person p;
  clrscr();
  p.id=2;
  strcpy(p.name,"kunal");
  printf("Values : \n the id is %d and name is %s \n",p.id,p.name);
  printf("Address: \n The addres in main of id is %p and name is %p",&(p.id),&(p.name));

  display(p);
  getch();
}

输出:

值(value)观:

id 为 2,名称为 kunal

地址:

id的main中的地址是FFEA,名称是FFEC

值:

ID 是:2 名字是:kunal

地址:

id函数中的地址为FFDE,名称为FFE0

最佳答案

在此结构声明中:

struct Person
{
  int id;
  char name[];
};

中,name成员就是所谓的“灵活数组成员”。这不是您想要的目的,特别是因为

In most situations, the flexible array member is ignored.

( C2011 6.7.2.1/18 )

异常与通过 .-> 运算符访问灵活数组成员有关。正如您所做的那样,按值将结构传递给函数并不是异常(exception)之一。所以是的,该函数不接收成员。此外,由于超出结构的边界(结构体可能足够大以容纳您正在写入的数据,但这不能保证)。

您可以使代码与现在的结构声明一起使用,方法是确保为原始结构(动态)分配足够的空间来容纳 name 成员的预期内容,并通过传递指向它的指针而不是按值传递它。但这肯定比它的值(value)要麻烦得多,而且它在某种程度上是特定于这种情况的,因为一个结构最多可以有一个灵活的数组成员。

当然,您真正想做的是声明具有大小的 name 成员。这就是 C 要求您声明数组的方式,灵活的数组成员是唯一的异常(exception)。 (函数参数不是异常(exception),尽管它们看起来可能是异常(exception)。这是一个不同的故事。)如果您声明带有大小的name,那么您的代码应该可以正常工作:

struct Person {
  int id;
  char name[20];
};

当然,这限制了您指定的大小。如果您想更具适应性,则可以将 name 声明为 char *,然后将其指向足够大的动态分配空间。这比灵活的数组成员更常见,也更广泛适用,但它对于您的练习来说可能有点大材小用。

关于c - 两个不同函数中相同结构对象的变量地址不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51634864/

相关文章:

c - 是否可以成功链接到具有不同导出 API 但具有相同对象名称的静态 linux 库?

c - 如何在 C 中仅提取此字符串的一部分?

检查其他目录中的文件是否存在

c - 如何使两个在其他方面相同的指针类型不兼容

c - OpenGL - 在窗口调整大小时保持纵横比

c - 为什么我不能用动态分配的数组覆盖数组(传递给另一个函数)?

c# - 计算机视觉 : Segmentation of XRay image vertebrae detection

有条件地定义 C 函数宏

c - 警告 : type qualifiers ignored on function return type in gcc 4. 1.2

c++ - 在 C/C++ 中将数据从一个文件复制到另一个文件的最快方法?