如何解决如何从仅具有该特定字段指针的字段的偏移量计算结构的起始地址
我有以下代码。结构 emp_ 有五个元素,它的所有前四个成员都可以用 print_emp_details()
函数打印,该函数接受一个指向 emp_
结构的指针。仅给定一个偏移量和一个指向特定字段的指针,start_address(glthread_node_t *node_t)
应返回(在转换后)结构 emp_ 的起始地址,然后将其传递给 print_emp_details()
。我从 print_emp_details() 得到乱码的 printf 输出,但找不到我做错了什么。 offsetValue 是我唯一做对的事情。
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <string.h>
#include "glthread.h"
#define glthread_node_init(glnode) \
glnode->left = NULL; \
glnode->right = NULL;
#define offset(struct_name,fld_name) \
(unsigned int)&(((struct_name *)0)->fld_name)
typedef struct glthread_node_ {
struct glthread_node_ *left;
struct glthread_node_ *right;
} glthread_node_t;
typedef struct glthread_ {
glthread_node_t *head;
unsigned int offset;
} glthread_t;
typedef struct emp_ {
char name[30];
unsigned int salary;
char designation[30];
unsigned int emp_id;
glthread_node_t glnode;
} emp_t;
struct emp_ *
start_address(glthread_node_t *node_t){
unsigned int offsetValue;
offsetValue=offset(emp_t,glnode);
printf("offset = %d\n",offsetValue);
return (struct emp_*)(node_t-offsetValue);
}
void
print_emp_details(emp_t *emp){
printf("Employee name = %s\n",emp->name);
printf("salary = %u\n",emp->salary);
printf("designation = %s\n",emp->designation);
printf("emp_id = %u\n",emp->emp_id);
}
void
init_glthread(glthread_t *glthread,unsigned int offset){
glthread->head = NULL;
glthread->offset = offset;
}
int
main(int argc,char **argv){
emp_t *emp1=calloc(1,sizeof(emp_t));
strncpy(emp1->name,"Harris",strlen("Harris"));
emp1->salary= 100;
strncpy(emp1->designation,"HR",strlen("HR"));
emp1->emp_id=13;
glthread_node_init((&emp1->glnode));
print_emp_details(start_address(&emp1->glnode));
return 0;
}
输出:
offset = 72
Employee name = ?T??
salary = 0
designation =
emp_id = 1920169263
解决方法
问题在start_address
的末尾:
return (struct emp_*)(node_t-offsetValue);
当您从指针中添加或减去一个值时,会导致指针增加/减少该值乘以指针指向的类型的大小。这样做是为了使数组索引工作。
您需要将指针强制转换为 char *
以添加/减去单字节值:
return (struct emp_*)((char *)node_t-offsetValue);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。