我正在尝试在我的结构内创建一个空指针数组,以查看是否可行。我想负责内存分配并能够通过索引更新每个数组的值。未指定值数据类型,因为我要接受任何数据类型。
这是我所做的:
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作为值。我不知道怎么了有人可以帮我改正并解释错误的地方,以便我学习吗?
为了安全起见,请使用正确的类型: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]);
您将(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]);