如何使用C中的整数打印和填充void *数组

时间:2016-04-08 06:19:01

标签: c arrays

我试图找出如何使用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]);
}

3 个答案:

答案 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);
}