知道元素地址如何找到包含这个元素的结构体地址

本文提供了一段使用C语言实现的测试代码,演示如何通过`struct_offset`宏找到结构体的首地址,并创建一个指针对该结构体进行直接修改。

关于这个东西,别人写的已经很详细了 

这里放张机票 http://blog.youkuaiyun.com/hilyoo/article/details/4464448


下面是我写的测试代码。

实现的功能是通过struct_offset找到结构体的首地址,

并创建一个指针来对该结构体直接进行修改。

#include <stdio.h>
#include <string.h>
#define STRUCT_OFFSET(stru_name, element) (unsigned long)&((struct stru_name*)0)->element
struct manname
{
	char buf[20];
	int fdname;
};

int main(int argc,char **argv)
{
	struct manname first;
	
	first.fdname = 20;
	unsigned long ofset = STRUCT_OFFSET(manname,fdname);

	struct manname *q ;
	q = (struct manname *)((int )&(first.fdname) - ofset);


	printf("the main address = %x\n",((int )&(first.fdname) - ofset));
	printf("the first address = %x\n",&(first));


	strcpy(q -> buf,"Heloo");
	printf("%s\n",first.buf);
	return 0;	
	
}

当你在 C/C++ 中定义一个结构体,并试图在其上动态添加一个元素时,可能会遇到结构体崩溃的情况。这通常是由于以下几个原因: 1. **内存不连续**:结构体在内存中是连续存储的,如果你在原有结构体上直接增加新的成员,可能会导致新成员的位置不连续,这在没有为结构体分配额外空间或使用动态内存的情况下是不允许的。 2. **类型不匹配**:如果尝试将不同类型的值添加到结构体中,编译器可能无法处理这种类型转换,从而引发错误。 3. **指针和引用**:如果你的结构体是通过指针或引用传递的,那么动态添加成员会影响到这些指向原结构体的指针或引用,可能导致悬垂指针或野指针。 4. **内存管理问题**:对于动态分配的结构体,如果没有正确地重新调整其内存,直接扩展可能会破坏结构体的对齐要求,导致崩溃。 5. **结构体改变大小**:如果结构体在原有的版本中被声明为常量(const),那么直接在运行时修改其大小是不允许的,这会违反语言的语义。 为避免这种情况,你可以: - 使用动态内存(如`malloc`/`calloc`)为结构体分配更大的空间,然后将新成员添加到新的内存区域。 - 如果需要扩展结构体,考虑使用结构体数组或者联合体(union)来包含多个不同版本的结构。 - 对于已存在的指针,需要更新指向新结构体的指针。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值