내 코드는 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 \n\r", *((int *)var_ts.buffer+i));
}
안녕하세요, 세상을!
데이터 값은 3 개
데이터 값이 7 개
데이터 값은 5
버전은 다음 두 경고하지만 컴파일이 있으며 생산 예상 출력 :
경고 : 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 \n\r", *((int *)var_ts.buffer+i));
}
test() 호출에서 앰퍼샌드를 제거하십시오. –
참고 :'void *'에서 포인터를 캐스팅 할 필요는 없습니다. 그렇게하면 다른 수준의 간접 지정이 실수로 사용 된 경우 문제를 숨길 수 있습니다. –