C 按索引更新值-结构内部的空指针数组

C 按索引更新值-结构内部的空指针数组,c,pointers,struct,C,Pointers,Struct,我试图在我的结构中创建一个空指针数组,看看这是否可行。我想负责内存分配,并能够通过索引更新每个数组的值。未指定值数据类型,因为我希望接受任何数据类型 这就是我所做的: typedef struct { void ** value; } bucket; void updateValue(bucket * data, index, void * value) { if(data->value[index] == NULL) { data->val

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

这就是我所做的:

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作为值输出。我不知道怎么了。有人能帮我纠正一下,解释一下错在哪里,这样我就可以学习了。

您将
(void*)(int)124
存储到
客户端->值[0]

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

因此,打印语句应该是

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

还要注意的是

    if(data->value[index] == NULL)
    {
       data->value[index] = (void*)calloc(1, sizeof(void*));
    }
应删除,以避免分配未使用的缓冲区并很快覆盖其地址而导致内存泄漏


也许您需要这样做(分配缓冲区并将数据复制到那里):

#包括
#包括
#包括/*用于使用memcpy()*/
类型定义结构{
无效**值;
}水桶;
void updateValue(bucket*数据、索引、void*值、大小\u t值大小)
{
数据->值[索引]=realloc(数据->值[索引],值大小);
memcpy(数据->值[索引]、值、值大小);
}
bucket*clients=calloc(1,sizeof(bucket));
客户->价值=(void**)calloc(3,sizeof(void*);
客户端->值[0]=NULL;
客户端->值[1]=NULL;
客户端->值[2]=NULL;
int值=124;
updateValue(客户端,0,&value,sizeof(value));
printf(“客户端0值:值:%d\n”,*(int*)客户端->值[0]);

您可能只需要一个单指针,而不是双指针。我想看看是否可以使用双指针,并通过索引访问每个数组。注意:感谢您的回复。数据->值[索引]=(void*)calloc(1,sizeof(void*));是需要的,所以我可以稍后释放它。但它在免费(客户端->值[0])上崩溃;并且不是免费的(&clients->value[0]);,为什么?您通过超出范围的访问调用了未定义的行为(
clients->value
有3个元素,并且少于5个),您的结果是偶然给出的。对不起,我知道这是超出范围的访问-我写得很快。表示免费(客户->价值[0]);崩溃,但不是免费的(&clients->value[0]);因为
客户端->值[0]
不是通过
malloc()
家族分配的指针,而
客户端->值[0]
是因为它是
客户端->值
。最后一个问题,我将(void*)(int)124改为int randomNumber=129;updateValue(客户端、0和随机数);,但是免费呼叫(客户端->值[0]);撞车,为什么?
#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]);