通过索引更新值-结构中的空指针数组

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

我正在尝试在我的结构内创建一个空指针数组,以查看是否可行。我想负责内存分配并能够通过索引更新每个数组的值。未指定值数据类型,因为我要接受任何数据类型。

这是我所做的:

typedef struct {
    void ** value;
} bucket;


void updateValue(bucket * data, index, void * value)
{
    if(data->value[index] == NULL)
    {
       data->value[index] = (void*)calloc(1, sizeof(void*));
    }

    data->value[index] = value;
}


bucket * clients = calloc(1, sizeof(bucket));

clients->value = (void **)calloc(3,  sizeof(void*));

clients->value[0] = NULL;
clients->value[1] = NULL;
clients->value[2] = NULL;


updateValue(clients, 0, (void*) (int)124);

printf("Client0 Value: value: %d\n",     (int)&clients->value[0]);

代码进行编译,但不输出124作为值。我不知道怎么了有人可以帮我改正并解释错误的地方,以便我学习吗?

c pointers struct
2个回答
0
投票

为了安全起见,请使用正确的类型:intptr_t是能够容纳指针的整数类型。

...
#include <stdint.h>   // for intptr_t
#include <inttypes.h> // for PRIdPTR

...

updateValue(clients, 0, (void *)124);

printf("Client0 Value: value: %" PRIdPTR "\n", (intptr_t)clients->value[0]);

或者,如果您愿意:

...
#include <stdint.h>   // for intptr_t

...

updateValue(clients, 0, (void *)124);

printf("Client0 Value: value: %d\n", (int)(intptr_t)clients->value[0]);

0
投票

您将(void*) (int)124存储到clients->value[0]

这意味着将值存储到元素,而不是作为元素的地址。

因此,打印声明应为

printf("Client0 Value: value: %d\n",     (int)clients->value[0]);

没有多余的&

还请注意部分

    if(data->value[index] == NULL)
    {
       data->value[index] = (void*)calloc(1, sizeof(void*));
    }

应该删除,以避免由于分配未使用的缓冲区并很快覆盖其地址而导致内存泄漏。


也许您想要这个(分配缓冲区并在其中复制数据):

#include <stdio.h>
#include <stdlib.h>
#include <string.h> /* for using memcpy() */

typedef struct {
    void ** value;
} bucket;


void updateValue(bucket * data, index, void * value, size_t valueSize)
{
    data->value[index] = realloc(data->value[index], valueSize);
    memcpy(data->value[index], value, valueSize);
}


bucket * clients = calloc(1, sizeof(bucket));

clients->value = (void **)calloc(3,  sizeof(void*));

clients->value[0] = NULL;
clients->value[1] = NULL;
clients->value[2] = NULL;


int value = 124;
updateValue(clients, 0, &value, sizeof(value));

printf("Client0 Value: value: %d\n",     *(int*)clients->value[0]);
© www.soinside.com 2019 - 2024. All rights reserved.