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