gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 19:04:37 25 4
gpt4 key购买 nike

我有两个函数,一个是 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com