如何在C中创建指向嵌套对象的指针?

时间:2015-03-01 09:52:16

标签: c pointers object

我有函数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;

2 个答案:

答案 0 :(得分:1)

对于parseLayerFile()setBoolChannels()的给定定义,编译器应该抱怨不兼容的参数,因为parseLayerFile试图传递setBoolChannels期望指针的结构。指针将像这样传递:

int parseLayerFile(WRAPPER_t * w, char*filename){
   setBoolChannels(&w->layer_files[file_no].command_orders[tmpi]);
}

据说仍会产生相同的错误消息:

  

无法访问地址0x7的内存......

地址0x7只是地址0x0的一个小偏移量。这可能意味着您正在使用指向某个结构或数组的空指针,并尝试访问结构/数组中的字段。

在您的情况下,这可能意味着w->layer_files[file_no].command_ordersw->layer_filesNULL或未初始化。

答案 1 :(得分:0)

例如:

WRAPPER_t wrapper;
wrapper.layer_files = malloc(...);
*(wrapper.layer_files) = SOME_VALUE;

只需将表达式struct.innerPointer视为' reguler'指针并对其采取行动,就好像。