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

1

将数组传递给函数会发送数组中第一个元素的地址,而不是将整个数组作为对象发送。该函数无法识别传递的地址是什么类型,所以它不能给你大小。

简单的解决方案是在结构中或随机传递数组的大小

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

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

    return 0;
}  
于 2015-11-19T00:52:52.970 回答
0

函数中传递的参数不是数组,而是指向数组的指针。c 中指针的大小在这里是 8 个字节。考虑一下我添加的代码,我首先创建了一个字符指针,然后使用 malloc 动态分配内存。由于 bitArray2 是一个 char 指针,它的大小是 8 而不是 2。在传递争论时,会创建一个新的 char 指针,因此它的大小是 8 而不是 2

    #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 回答