web-dev-qa-db-ja.com

割り当ては、キャストや他の質問なしで整数からポインターを作成します

数日前に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を使用する別の警告を回避する唯一の解決策です。

私は他の「割り当てはキャストなしでポインターから整数を作る」トピック/質問をチェックしましたが、それらから最終的な答えを得ることができませんでした。

ご協力ありがとうございました。

7
Indigo
unsigned int * int32result[1024]

1024の配列を宣言しますunsigned intpointers。代わりにここにintの配列が必要だと思います

unsigned int int32result[1024]

charToInt32引数にもunsigned int * int32result[]配列の配列が指定されているunsigned intにも同様の問題があります。単一の配列があるため、代わりにunsigned int * int32resultを渡すことができます(つまり、[]を削除します)。

あなたのコードの残りの部分は、その時点で機能するはずです。のような呼び出し

charToInt32(clearText, int32result);

と同等です

charToInt32(clearText, &int32result[0]);
8
simonc

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レベルのポインターが多すぎます。

2
Daniel Fischer

表示される警告は、ポインターに整数値を割り当てているという事実に基づいています。

/* 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ステートメントがプログラムが期待どおりに動作するように見える理由です。

1
Rerito
unsigned int * int32result[] 

unsigned intポインターの配列であるため、値をポインターに割り当てています。

0
parkydr