我想创建一个常规的打印数组功能。此函数将根据数据类型打印数组元素。
#include "utilities.h"
//type : 0 ->int
// : 1->char
void print_array(void *arr, int length, int type){
int i = 0;
for(i=0;i<length;i++){
switch(type) {
case 0:
printf("Integer %d %d\n", (int*)(arr+i));
break;
case 1:
printf("%c \n", (char*)(arr+i));
break;
case 2:
printf("%s \n", (char*)(arr+i));
break;
case 3:
printf("%x \n", (int*)(arr+i));
break;
default:
printf("Format not supported yet. %d \n",type);
return;
}
}
}
void test_print_array(){
int int_arr[3] = {0,1,2};
print_array(int_arr,3,0);
}
int main(){
test_print_array();
return 0;
}
我得到的输出是
整数-486474964
整数-486474963
整数-486474962
而不是0,1,2
我也尝试使用arr [i]代替(int *)(arr + i),但在此过程中我遇到编译器错误。
答案 0 :(得分:3)
您正在使用void*
类型的指针算术,其大小未知。您必须在执行arithmetc之前先将指针强制转换为 ,但无论如何还是要使用数组符号。
#include <stdio.h>
void print_array(void *arr, int length, int type){
int i = 0;
for(i=0;i<length;i++){
switch(type) {
case 0:
printf("int %d\n", ((int*)arr)[i]);
break;
case 1:
printf("char %c\n", ((char*)arr)[i]);
break;
case 2:
printf("string %s \n", ((char**)arr)[i]);
break;
case 3:
printf("hex %X\n", ((unsigned*)arr)[i]);
break;
default:
printf("Format not supported yet. %d \n",type);
return;
}
}
}
void test_int_array(){
int int_arr[3] = {0, 1, 2};
print_array(int_arr, 3, 0);
}
void test_char_array(){
char char_arr[3] = {'x', 'y', 'z'};
print_array(char_arr, 3, 1);
}
void test_str_array(){
char *str_arr[3] = {"one", "two", "three"};
print_array(str_arr, 3, 2);
}
void test_uns_array(){
unsigned uns_arr[3] = {26, 27, 28};
print_array(uns_arr, 3, 3);
}
int main(){
test_int_array();
test_char_array();
test_str_array();
test_uns_array();
return 0;
}
程序输出:
int 0 int 1 int 2 char x char y char z string one string two string three hex 1A hex 1B hex 1C
答案 1 :(得分:0)
除非数据引用正确对齐且具有有效值,否则常规打印数组功能容易出现未定义行为(UB)。
话虽如此,请尝试
//printf("Integer %d %d\n", (int*)(arr+i));
// vv-------- print a `%`
printf("Integer %%d %d\n", ((int*)arr)[i]);
// ^---------^ form a `int *` and then use [i]
将i
添加到void*
是UB。首先将void *
指针 强制转换为所需的指针类型,然后使用索引[i]
。