簡體   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