我试图找出如何使用void *
数组,以便我可以用任何数据类型填充它们。例如,我想用整数值填充数组,然后打印该数组的值。要做到这一点,我一直在尝试下面的事情,但我很确定我有完全错误的想法。我该怎么做呢?
#define ARRAY_LENGTH 10
void *arr1;
for (int i = 0; i < ARRAY_LENGTH; i++) {
void *indexPtr = arr1 + i*sizeof(int);
indexPtr = &i;
}
for (int i=0; i < length; i++) {
printf("new value %d\n", (int)&arr1[i]);
(*insert)(list, &arr1[i]);
}
答案 0 :(得分:0)
使用整数填充数组:
#define ARRAY_LENGTH 10
/* expect arr1 to look at an already allocated memory chunk of type (void*) */
int *int_array = (int*)arr1;
for (int i = 0; i < ARRAY_LENGTH; i++) {
int_array[i] = i;
}
打印数组
for (int i=0; i < ARRAY_LENGTH; i++) {
printf("new value %d\n", int_array[i]);
}
由于void*
上的指针算术是非法的,您必须将其转换为其他指针类型。在使用之前将它浇铸一次是最简单的方法;在这种情况下,是一个整数指针。
答案 1 :(得分:0)
第一个void * arr1不是数组 - 它只是指向任何东西。
第二 - 你可以从一些多字节对象开始工作获取地址将其转换为类型(void *)所以你得到void * arr1,其中包含一些值。
对于arr1 [i]或(arr1 + i),你必须将指针arr1转换为某种类型(int )(float *)等(struct ustract *)答案 2 :(得分:-1)
如果你在尝试访问数组之前没有malloc
内存,那么你的指针可能会破坏内存中的随机地址。
首先要做的事情是:
#define ARRAY_LENGTH 10 // 10 Bytes
int main()
{
char *char_arr;
// Initial memory allocation
char_arr = (char *) malloc(ARRAY_LENGTH);
// [Do stuff]
free(char_arr); // Don't forget to free!!!!
return(0);
}
然后,如果您想要使用其他类型访问您的阵列,则不得破坏strict aliasing rule。 正如@atturri所说,指针算法对于void指针是非法的。
因此,您必须使用新指针来使用其他类型访问数组。而且你必须处理新数组的上限:
int *int_array = (int*) char_arr;
int elementsCount = sizeof(*int_array) / sizeof(*char_arr);
for (int i = 0; i < elementsCount ; i++)
{
int_array[i] = i;
}
#define ARRAY_LENGTH 10 // 10 Bytes
int main()
{
char *char_arr;
int *int_array = (int*) char_arr;
int elementsCount = sizeof(*int_array) / sizeof(*char_arr);
int i;
// Initial memory allocation
char_arr = (char *) malloc(ARRAY_LENGTH);
// Do stuff
for (i = 0; i < elementsCount ; i++)
{
int_array[i] = i*2;
printf("int_array[%d]=%d", i, int_array[i]);
}
free(char_arr);
/* Don't forget to free!! (Even if it's not "dangerous"
* in this example in the main since we are about to quit */
return(0);
}