[英]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.