1

2 つの 1 バイト値を含む配列を関数に渡す状況がありますが、どういうわけか、関数は配列の長さが 4 バイトであると認識し、ビット操作が大幅に台無しになります。各配列値を , として明示的にキャストしようとしましたuint8が、役に立ちませんでした。何が起こっているのかについてのアイデアはありますか? Eclipse Mars.1 で cygwin の gcc ツールを使用します。

typedef char uint8; //char is 1 byte in my system.

void setBitArray(uint8 bitArray[], int first, int last, uint8 type) {
    if(first >= 0 && last < sizeof(bitArray) * 8) { // If the block is in bounds
        ...
    }
}
...
int main() {
    uint8 bitArray[2] = {(uint8)0, (uint8)0};
    setBitArray(bitArray, 0,10, 1);
    return 0;
}

編集

もう一つ。sizeof(bitArray) は、main() で 2 バイトを生成します。

4

2 に答える 2

0

関数で渡される引数は配列ではなく、配列へのポインターです。ここでは、c のポインターのサイズは 8 バイトです。最初に文字ポインタを作成し、次に malloc を使用してメモリを動的に割り当てたコードを考えてみましょう。bitArray2 は char ポインターであるため、そのサイズは 2 ではなく 8 です。引数を渡すと、新しい char ポインターが作成されるため、そのサイズは 2 ではなく 8 になります。

    #include <stdio.h>
    typedef char uint8; //char is 1 byte in my system.

    void setBitArray(char bitArray[], int first, int last, uint8 type) {
        // if(first >= 0 && last < sizeof(bitArray) * 8) { // If the block is in bounds
            printf("Adress location = %ld\n", &bitArray);
            printf("%ld\n", sizeof(bitArray));         
        // }
    }
    int main() {
        char bitArray[2] ;  
        char *bitArray2=(char *)malloc(sizeof(char)*2);
        printf("Address = %ld\n", &bitArray);
        printf("s = %ld\n", sizeof(bitArray));    
        printf("s = %ld\n", sizeof(bitArray2));    
        setBitArray(bitArray, 0,10, 1);
        return 0;
    }
于 2015-11-19T00:59:19.657 に答える