试图编写一个C代码片段来存储和检索结构指针数组。我已经复制了以下代码段。
我要在这里做什么-
我的观察结果是:(请查看代码末尾的输出)
这是怎么回事?根据指针算术,C不应按结构的大小(而是按指针的大小)递增C。
在这种情况下,有人可以帮我遮挡些什么吗?欢迎任何代码更改建议。谢谢!
#include <stdio.h>
#define X_PROCESS_DUMP_CB_MAX 3
typedef struct {
void* cb_func; /* pointer to callback function */
unsigned cb_arg; /* not interpreted by the framework*/
} X_cb_data_t;
typedef struct err_cb_t{
X_cb_data_t Xos_cb;
unsigned short priority;
struct err_cb_t *next;
}Xos_exit_cb_t;
struct Xos_local_client {
int x; //just placeholder
Xos_exit_cb_t *exit_cb[X_PROCESS_DUMP_CB_MAX];
int y; //just placeholder
};
/*static global to this file, init this in main before accessing it*/
static struct Xos_local_client localclient;
int Xos_get_cb_info_from_handle(int client_handle, Xos_exit_cb_t** cb_head)
{
*cb_head = (Xos_exit_cb_t *)&localclient.exit_cb[0];
return 0;
}
int main()
{
int i = 0;
/*init localclient here*/
localclient.x =1;
localclient.y =2;
for(i =0; i< X_PROCESS_DUMP_CB_MAX; i++)
{
Xos_exit_cb_t *exit_cb_p = (Xos_exit_cb_t *)malloc(sizeof(Xos_exit_cb_t));
localclient.exit_cb[i] = exit_cb_p;
printf("&exit_cb_p: %p exit_cb_p: %p\n", (unsigned int)&localclient.exit_cb[i],(unsigned int)exit_cb_p);
}
/*Test code that fails*/
Xos_exit_cb_t** exit_cb_head; /*Pointer to pointer of exit_cb*/
Xos_exit_cb_t **temp1;
Xos_exit_cb_t **temp2;
if (!Xos_get_cb_info_from_handle(3, exit_cb_head)) {
temp1 = &(*exit_cb_head)[0];
temp2 = &(*exit_cb_head)[1];
printf("temp1: %p, temp2: %p\n", temp1, temp2);
}
return 0;
}
/*Output*/
&exit_cb_p: 0x40300c exit_cb_p: 0xd18628
&exit_cb_p: 0x403010 exit_cb_p: 0xd426c0
&exit_cb_p: 0x403014 exit_cb_p: 0xd426d8
exit_cb_head: 0x40300c, temp1: 0x40300c, temp2: 0x40301c
答案 0 :(得分:0)
在您的for
循环中
for(i =0; i< X_PROCESS_DUMP_CB_MAX; i++)
{
Xos_exit_cb_t *exit_cb_p = (Xos_exit_cb_t *)malloc(sizeof(Xos_exit_cb_t));
localclient.exit_cb[i] = exit_cb_p;
printf("&exit_cb_p: %p exit_cb_p: %p\n", (unsigned int)&localclient.exit_cb[i],(unsigned int)exit_cb_p);
}
您正在迭代指针数组。因此,您会看到根据指针算术的增量(按指针大小的增量)
现在假设您的代码粘贴在这里错过了@reichhart即在评论中提到的复制粘贴。
Xos_exit_cb_t** exit_cb_head = &(localclient.exit_cb[0]);
temp1
和temp2
(类型Xos_exit_cb_t *
)是分配结构的内存中的实际地址。因此,相邻元素的基地址将由结构大小分隔。
希望有帮助。