操纵指针数组的指针

问题描述 投票:0回答:1

尝试编写C片段来存储和检索结构指针数组。我复制了我的片段。

我想在这里做什么 -

  1. 方法Xos_get_cb_info_from_handle()应返回指向结构localclient.exit_cb的基址的指针。这似乎工作。
  2. 获得这个基地址后,我想索引到数组。
  3. 作为练习的一部分,temp1应该存储第0个索引(第一个元素)的地址,temp2应该存储第一个索引(第二个元素)的地址。

我的观察是:(查看代码末尾的输出)

  1. 我在temp1中得到的基址是正确的,即0x40300c
  2. 但是,下一个元素(索引1)应为0x403010。这实际上是0x40301c。它似乎随着结构的大小而增加。

这里发生了什么?根据指针运算,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
c pointers data-structures structure
1个回答
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]);

temp1temp2(类型为Xos_exit_cb_t *)是内存中分配结构的实际地址。因此,相邻元素的基地址将由结构的大小分开。

希望有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.