私のコードは配列をvoidポインタに渡す必要があります(構造体にはvoid *があり、変更できません)。以下の2つのバージョンのコードは同じ出力を生成しますが、後者のコードでは2つの警告があります。私の質問は、2つの方法のどちらが優先されるかです。警告を削除するために型キャストする方法はありますか?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
以下このバージョンでは、2回の警告を有するが、コンパイルし、生成します期待される出力:
警告: source_file.c:関数 'main'で: source_file.c:17:10:警告:互換性のないポインタ型から 'test'の引数1を渡します。 test(& 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 *'からのポインタをキャストする必要はありません。異なるレベルの間接指定が誤って使用された場合、問題を隠すことができます。 –