如何在 C 中创建指向嵌套对象的指针?
how to create pointer to nested objects in C?
我有调用函数 setBoolChannels 的函数:
int parseLayerFile(WRAPPER_t * w, char*filename){
setBoolChannels(w->layer_files[file_no].command_orders[tmpi]);
}
从 main 调用 parseArgs:
parseArgs(w, argc, argv)
;
如何在函数parseLayerFile中访问对象w->layer_files[file_no].command_orders[tmpi]来访问其成员进行更新?该功能目前为空,但我无法访问获取对象。
void setBoolChannels(LAYER_COMMAND_ORDER_t * cmd, char * token, uint32_t n){
cmd; // here I got cmd (LAYER_COMMAND_ORDER_t *) 0x7
}
无法访问地址为 0x7 的内存 ...
我可以访问整个 WRAPPER_t 对象,但我很好奇是否可以访问嵌套对象(创建指向它的指针)。
以下是我使用的类型:
typedef struct LAYER_COMMAND_ORDER_
{
uint16_t * id;
} LAYER_COMMAND_ORDER_t;
typedef struct LAYER_FILE_
{
LAYER_COMMAND_ORDER_t * command_orders;
} LAYER_FILE_t;
typedef struct WRAPPER_
{
LAYER_FILE_t * layer_files;
} WRAPPER_t;
例如:
WRAPPER_t wrapper;
wrapper.layer_files = malloc(...);
*(wrapper.layer_files) = SOME_VALUE;
只需将表达式 struct.innerPointer 看成 'reguler' 指针并对其进行操作就好像。
使用 parseLayerFile()
和 setBoolChannels()
的给定定义,编译器应该抱怨参数不兼容,因为 parseLayerFile
试图传递一个结构,其中 setBoolChannels
需要一个指针。指针将像这样传递:
int parseLayerFile(WRAPPER_t * w, char*filename){
setBoolChannels(&w->layer_files[file_no].command_orders[tmpi]);
}
据推测仍然会产生相同的错误消息:
Cannot access memory at address 0x7 ...
地址 0x7 只是地址 0x0 的一个小偏移量。这可能意味着您正在使用指向某个结构或数组的空指针并尝试访问 struct/array.
中的字段
在您的情况下,这可能意味着 w->layer_files[file_no].command_orders
或 w->layer_files
是 NULL
或未初始化。
我有调用函数 setBoolChannels 的函数:
int parseLayerFile(WRAPPER_t * w, char*filename){
setBoolChannels(w->layer_files[file_no].command_orders[tmpi]);
}
从 main 调用 parseArgs:
parseArgs(w, argc, argv)
;
如何在函数parseLayerFile中访问对象w->layer_files[file_no].command_orders[tmpi]来访问其成员进行更新?该功能目前为空,但我无法访问获取对象。
void setBoolChannels(LAYER_COMMAND_ORDER_t * cmd, char * token, uint32_t n){
cmd; // here I got cmd (LAYER_COMMAND_ORDER_t *) 0x7
}
无法访问地址为 0x7 的内存 ...
我可以访问整个 WRAPPER_t 对象,但我很好奇是否可以访问嵌套对象(创建指向它的指针)。
以下是我使用的类型:
typedef struct LAYER_COMMAND_ORDER_
{
uint16_t * id;
} LAYER_COMMAND_ORDER_t;
typedef struct LAYER_FILE_
{
LAYER_COMMAND_ORDER_t * command_orders;
} LAYER_FILE_t;
typedef struct WRAPPER_
{
LAYER_FILE_t * layer_files;
} WRAPPER_t;
例如:
WRAPPER_t wrapper;
wrapper.layer_files = malloc(...);
*(wrapper.layer_files) = SOME_VALUE;
只需将表达式 struct.innerPointer 看成 'reguler' 指针并对其进行操作就好像。
使用 parseLayerFile()
和 setBoolChannels()
的给定定义,编译器应该抱怨参数不兼容,因为 parseLayerFile
试图传递一个结构,其中 setBoolChannels
需要一个指针。指针将像这样传递:
int parseLayerFile(WRAPPER_t * w, char*filename){
setBoolChannels(&w->layer_files[file_no].command_orders[tmpi]);
}
据推测仍然会产生相同的错误消息:
Cannot access memory at address 0x7 ...
地址 0x7 只是地址 0x0 的一个小偏移量。这可能意味着您正在使用指向某个结构或数组的空指针并尝试访问 struct/array.
中的字段在您的情况下,这可能意味着 w->layer_files[file_no].command_orders
或 w->layer_files
是 NULL
或未初始化。