首页 文章

解释使用void指针之间的区别

提问于
浏览
2

我的代码需要将一个数组传递给一个void指针(该struct具有无法修改的(void *)) . 下面的两个版本的代码产生相同的输出,但后者有两个警告 . 我的问题是两种方法中哪一种更受欢迎?有没有办法强制删除警告?

此版本没有警告并按预期生成输出:

#include <stdio.h>

void test(void *var_arr, char var_1);

typedef struct {
    char chip;
    void *buffer;
}test_struct;

int main()
{
   int test_array[3] = {3,7,5};
    char var_1 = 0x20;

    printf("Hello, World!\n");

    test(&test_array, var_1);
    return 0;
}

void test(void *var_arr, char var_1)
{
    int i;

    test_struct var_ts;

    var_ts.chip = var_1;
    var_ts.buffer = var_arr;

    for (i=0; i<3; ++i)
        printf("\nThe data values are : %X \n\r", *((int *)var_ts.buffer+i));

}

你好,世界!

数据值为:3

数据值为:7

数据值为:5


下面这个版本有两个警告,但编译并产生预期的输出:

警告:source_file.c:在函数'main'中:source_file.c:17:10:警告:从不兼容的指针类型test(&test_array,var_1)传递'test'的参数1; ^ source_file.c:3:6:注意:期望'int'但参数的类型为'int()[3]'void test(int * var_arr,char var_1);

#include <stdio.h>

void test(int *var_arr, char var_1);

typedef struct {
    char chip;
    void *buffer;
}test_struct;

int main()
{
   int test_array[3] = {3,7,5};
    char var_1 = 0x20;

    printf("Hello, World!\n");

    test(&test_array, var_1);
    return 0;
}

void test(int *var_arr, char var_1)
{
    int i;

    test_struct var_ts;

    var_ts.chip = var_1;
    var_ts.buffer = (void *)var_arr;

    for (i=0; i<3; ++i)
        printf("\nThe data values are : %X \n\r", *((int *)var_ts.buffer+i));

}

2 回答

  • 1

    较低版本告诉你第一个问题是什么:将指针传递给数组而不是指向第一个元素的指针 .

    将指针传递给数组,其类型为 int(*)[3]

    test(&test_array, var_1);
    

    将指针传递给第一个元素,该元素的类型为 int*

    test(test_array, var_1);
    

    代码恰好起作用,因为两个指针指向同一个地址,因此指向数组的指针似乎有效,但代码仍未定义 .

    将指针传递给第一个元素是正确的,因为类型为 int[3] 的数组test_array在传递给函数时会衰减为 int* .

  • 0

    显示警告是因为编译器对代码进行静态分析并确定了可能的错误原因 .

    使用void指针时,编译器无法执行此静态分析,因为它不知道使用的是什么类型 .

    如果数据类型已知,我总是更喜欢使用此类型作为指针而不是void指针 . 当指针可以指向任何东西时,我只会使用void指针 . 最后,这是关于个人品味和您遵循的代码指南 .

相关问题