gpt4 book ai didi

c - 解释使用void指针的区别

转载 作者:行者123 更新时间:2023-12-04 10:51:16 26 4
gpt4 key购买 nike

我的代码需要将一个数组传递给一个 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));

}

Hello, World!

数据值为:3

数据值为:7

数据值为:5


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

Warning(s): source_file.c: In function ‘main’: source_file.c:17:10: warning: passing argument 1 of ‘test’ from incompatible pointer type test(&test_array, var_1); ^ source_file.c:3:6: note: expected ‘int ’ but argument is of type ‘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));

}

最佳答案

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

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

test(&test_array, var_1);

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

test(test_array, var_1);   

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

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

关于c - 解释使用void指针的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40266686/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com