打印整数数组时输出不正确

时间:2019-04-24 22:50:00

标签: c

我想创建一个常规的打印数组功能。此函数将根据数据类型打印数组元素。

#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),但在此过程中我遇到编译器错误。

2 个答案:

答案 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]