解释void指针使用的区别



我的代码需要传递一个数组到一个void指针(结构体有(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 nr", *((int *)var_ts.buffer+i));
}

你好,世界!

数据值为:3

数据值为:7

数据值为:5


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

警告(s):source_file.c:在main函数中:Source_file.c:17:10:警告:从不兼容的指针类型传递' test '的参数1测试(和test_array var_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 nr", *((int *)var_ts.buffer+i));
}

较低的版本告诉您第一个版本的问题:传递指向数组的指针而不是指向第一个元素的指针。

传递指向数组的指针,该数组类型为int(*)[3]:

test(&test_array, var_1);

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

test(test_array, var_1);   

代码恰好有效,因为两个指针指向同一个地址,所以指向数组的指针似乎有效,但代码仍然未定义。

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

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

当使用void指针时,编译器不能做这种静态分析,因为它不知道使用的是什么类型。

如果数据类型是已知的,我总是倾向于使用这种类型的指针而不是void指针。我只会使用void指针,当它是可以接受的指针可以指向任何东西。最后,这是关于个人品味和你遵循的代码指南。

相关内容

  • 没有找到相关文章

最新更新