数日前にCの学習を始めたばかりで、ポインターに少し問題があります。文字列を整数の配列に変換しようとしています。以下の小さなスニペットは機能しているようですが、警告が表示されます:
関数 'charToInt32'の警告:代入はキャストなしで整数からポインターを作成します[デフォルトで有効] | || ===ビルドが完了しました:エラー0、警告1(0分、0秒)=== |
警告はラインから来ます
int32result[pos] = returnedInteger;
だから、私は何が最良の解決策かを理解しようとしています。 strncpy(整数にstrncpyを使用できますか)または他の何かを使用する必要がありますか、または完全にポインターを誤解しましたか?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int charToInt32(char * clearText, unsigned int * int32result[])
{
int i = 0, j = 0, pos = 0; /* Counters */
int dec[4] = {24, 16, 8, 0}; /* Byte positions in an array*/
unsigned int returnedInteger = 0; /* so we can change the order*/
for (i=0; clearText[i]; i+=4) {
returnedInteger = 0;
for (j=0; j <= 3 ; j++) {
returnedInteger |= (unsigned int) (clearText[i+j] << dec[j]) ;
}
int32result[pos] = returnedInteger;
pos++;
}
return pos;
}
int main()
{
int i = 0;
unsigned int * int32result[1024] = {0};
char * clearText = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
printf(">>Clear: %s\n", clearText);
charToInt32(clearText, int32result); // Do the conversion to int32.
printf(">>Int32 converted: ");
for (i=0; int32result[i]; i++)
printf("%u ", (unsigned int) int32result[i]);
printf("\n");
return 0;
}
また、プログラムの最後に次の行があります。
printf("%u ", (unsigned int) int32result[i])
Int32result [i]をunsigned intにキャストすることが、unsigned int *に%uを使用する別の警告を回避する唯一の解決策です。
私は他の「割り当てはキャストなしでポインターから整数を作る」トピック/質問をチェックしましたが、それらから最終的な答えを得ることができませんでした。
ご協力ありがとうございました。
unsigned int * int32result[1024]
1024の配列を宣言しますunsigned int
pointers。代わりにここにintの配列が必要だと思います
unsigned int int32result[1024]
charToInt32
引数にもunsigned int * int32result[]
配列の配列が指定されているunsigned int
にも同様の問題があります。単一の配列があるため、代わりにunsigned int * int32result
を渡すことができます(つまり、[]
を削除します)。
あなたのコードの残りの部分は、その時点で機能するはずです。のような呼び出し
charToInt32(clearText, int32result);
と同等です
charToInt32(clearText, &int32result[0]);
charToInt32
を宣言して、ポインターへのポインターへのunsigned int
を引数として取り、
int charToInt32(char * clearText, unsigned int * int32result[])
ただし、unsigned int
の配列として引数を使用するため、引数は
unsigned int *int32result
または同等(関数宣言で!!一般的ではありません)
unsigned int int32result[]
main
では、次のようになります
unsigned int int32result[1024] = {0};
また、1レベルのポインターが多すぎます。
表示される警告は、ポインターに整数値を割り当てているという事実に基づいています。
/* int32result is an array of POINTERS */
unsigned int * int32result[];
/* But returnedInteger is an int */
unsigned int returnedInteger = 0;
/*...*/
/* int32result[pos] is a pointer to an integer ...
* Thus here, you assign a "pure" integer to a pointer,
* hence the warning */
int32result[pos] = returnedInteger;
また、値をキャストしない場合、printfを押すとコンパイラーが警告を発するのもまったく正気です。実際、一般的なマシンのポインターは多くの場合32または64ビットであり、これはfaulty割り当て中の情報損失を回避するのに十分です。これが、printステートメントがプログラムが期待どおりに動作するように見える理由です。
unsigned int * int32result[]
unsigned int
ポインターの配列であるため、値をポインターに割り当てています。