繁体   English   中英

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

[英]How to print and fill void * array with integers in C

我试图弄清楚如何使用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]);
}

用整数填充数组:

#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*指针算术是非法的,因此必须将其强制转换为其他指针类型。 最简单的方法是在开始使用之前先对其进行转换。 在这种情况下,指向整数指针。

第一个void * arr1不是数组-它只是指向任何内容的指针。

第二-您可以开始工作,从某个多字节对象获取地址,将其类型转换为(void *),这样您就可以得到其中包含一些值的void * arr1。

对于arr1 [i]或(arr1 + i),第3个参数必须将指针arr1转换为某种类型(int )(float *)等(结构ustract *)

如果不这样做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);
}

然后,如果要使用另一种类型访问数组,则一定不要违反严格的别名规则 正如@atturri所说,使用无效指针时指针算术是非法的。

因此,您必须使用新的指针来使用其他类型访问数组。 而且,您必须注意新数组的上限:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM