c - 如何创建一个包含指向另一个未指定类型的结构的指针的结构?
问题描述
这是将包含另一个(变量)结构的结构:
typedef struct {
char * mem_addr;
char * name;
int option;
void * struct_pointer;
} Handle;
我不知道该结构将是什么,因为我希望有一组可供嵌套的结构,然后根据需要转换为正确的类型。一个例子可能是:
typedef struct{
char * policy;
int size;
char * addr;
} PS_call_struct;
我用这个函数初始化这些结构:
threadHandle * createHandle(char * mem_addr, char * name, int option, void * struct_pointer){
threadHandle * new = malloc(sizeof(threadHandle));
new->mem_addr = malloc(strlen(mem_addr)+1);
strcpy(new->mem_addr,mem_addr);
new->name = malloc(strlen(name)+1);
strcpy(new->name,name);
new->option = malloc(sizeof(int));
new->option = option;
new->struct_pointer = malloc(strlen(struct_pointer)+1);
strcpy(new->struct_pointer,struct_pointer);
return new;
}
和这个:
PS_call_struct * createPS_call_struct(char *policy, int size, char *addr){
PS_call_struct * new = malloc(sizeof(PS_call_struct));
new->policy = malloc(strlen(policy)+1);
strcpy(new->policy, policy);
new->size = malloc(sizeof(int));
new->size = size;
new->addr = malloc(strlen(addr)+1);
strcpy(new->addr, addr);
return new;
}
一旦我想使用嵌套结构,我就对其进行了转换。我测试如下:
PS_call_struct * ps1 = createPS_call_struct(&h, 999, &k);
Handle * write_handle = createHandle(SRV_SOCK_PATH, "thread_cream",777,ps1);
PS_call_struct * techk = (PS_call_struct* )(write_handle->struct_pointer);
现在我遇到了一个问题,因为重铸后我无法访问任何值。我可以ps1
毫无问题地访问值,但值techk
大多为空。我不能像下面那样指定结构类型,因为我想选择使用另一种类型的结构。
typedef struct {
char * mem_addr;
char * name;
int option;
int write_byte_size;
PS_call_struct * struct_pointer;
} Handle;
我不确定我所问的是否真的可行,或者我的方法是否不正确。谢谢您的帮助。
解决方案
该strlen
函数需要一个指向空终止字符串的指针。In createHandle
,struct_pointer
不是以空结尾的字符串,而是指向 的指针PS_call_struct
,因此这不会像您期望的那样工作。
您真正想要的是简单地将指针分配给struct_pointer
:
new->struct_pointer = struct_pointer;
另外,这没有意义:
new->option = malloc(sizeof(int));
new->option = option;
因为该字段option
不是指针而只是一个int
,所以摆脱malloc
调用。
推荐阅读
- javascript - Python中是否有任何运算符来检查和比较类型和值?
- python-3.x - 如何为特定的 python 版本安装 pip3
- python - 如何在 IDLE 上运行特定于命令提示符的 python 库?
- node.js - 将 Google Cloud SQL Server 部署到 Heroku
- oracle - 如何从 Oracle 和 Linq 中的列中获取最小未使用数?
- selenium - 如何在 Selenium 负载测试期间设置最大并发用户数?负载测试并行打开的并发用户比我设置的多
- c - 条件 !fork() 和 fork() > 0 有什么区别?
- flutter - dart 构造函数中的冒号是什么意思?
- laravel - Laravel5 事件“删除”在 Model::whereIn() 上不起作用
- json - 从 json 填充选择器,SwiftUI