当前位置: 首页 > 知识库问答 >
问题:

解释使用void指针的区别

孙福
2023-03-14

我的代码需要将数组传递给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 \n\r", *((int *)var_ts.buffer+i));

}

你好,世界!

数据值为:3

数据值为:7

数据值为:5

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

警告:源文件。c:在函数“main”中:源文件。c:17:10:警告:从不兼容的指针类型测试传递“test”的参数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个答案

柯天宇
2023-03-14

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

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

如果数据类型是已知的,我总是更喜欢使用该类型作为指针,而不是空指针。我只会在指针可以指向任何东西的情况下使用void指针。最后,这是关于个人品味和您遵循的代码准则。

傅茂实
2023-03-14

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

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

test(&test_array, var_1);

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

test(test_array, var_1);   

由于两个指针指向同一个地址,因此代码正常工作,因此指向数组的指针似乎正常工作,但代码仍然未定义。

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

 类似资料:
  • void与空类型指针 空类型的指针可以存储任何类型变量(普通变量,一级指针变量,二级指针变量,三级指针变量,多级指针变量等等...)的地址,因为编译器决定了地址存储尺寸 空类型的指针既不可以间接取值,也不可以间接赋值(也就是只能存储内存地址,而不能根据内存地址进行间接访问操作) 将空类型的指针转化为具体指针类型,然后就达到了既明确了指针的解析步长,也明确了解析方式 ///01.void.c #in

  • 本文向大家介绍指针数组、数组指针、函数指针的区别?相关面试题,主要包含被问及指针数组、数组指针、函数指针的区别?时的应答技巧和注意事项,需要的朋友参考一下 指针数组:首先它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身的大小决定,每一个元素都是一个指针,在32 位系统下任何类型的指针永远是占4 个字节。它是“储存指针的数组”的简称。 数组指针:首先它是一个指针,它指向一个数组。在32

  • 问题内容: 我一直在玩Go制作一些数据结构库,这是一个大问题。我希望数据结构能够包含任何类型,但是在Go中我看不到任何方法可以执行此操作,因为您无法声明空指针,并且它们没有像NSObject这样的类,所有对象都可以从中继承。如何在Go中实现相同的功能? 问题答案: 根据Go编程语言规范: 类型实现包含其方法的任何子集的任何接口,因此可以实现几个不同的接口。例如,所有类型都实现 空接口 : 如果您在

  • 问题内容: 我们可以用这种方式在golang中创建结构。下面的示例:两者之间有什么区别? 是否有诸如内存之类的取舍? 更新: 假设以下功能: 问题答案: 是的,有很多事情要考虑。首先:让我们从指针示例中明显的语法错误开始: 因此,我已将星号移至该类型,并已将字段强制化。该包使用反射来设置字段的值,因此需要将其导出。 看到您正在使用json标签时,让我们从简单的事情开始: 当我解组没有价值的消息时,

  • 本文向大家介绍C 指针和引用的区别相关面试题,主要包含被问及C 指针和引用的区别时的应答技巧和注意事项,需要的朋友参考一下 (1)指针:指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元;而引用跟原来的变量实质上是同一个东西,只不过是原变量的一个别名而已。 (2)指针可以有多级,但是引用只能是一级(int **p;合法 而 int &&a是不合法的) (3)指针的值可以为空,但

  • 本文向大家介绍解释使用C语言进行功能间通信的指针。,包括了解释使用C语言进行功能间通信的指针。的使用技巧和注意事项,需要的朋友参考一下 我们知道,函数可以按值调用,也可以按引用调用。 如果在调用的函数中实际参数不应更改,则按参数传递值。 如果在调用的函数中实际参数的值需要更改,则使用传递引用。 如果函数必须返回多个值,请使用按引用调用间接返回这些值。 示例 以下是用于演示返回多个值的C程序- 输出