我有一种情况,我将一个包含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个字节。
答案 0 :(得分: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;
}
答案 1 :(得分:0)
函数中传递的争论不是数组,而是指向数组的指针。 c中指针的大小为8字节。考虑我添加的代码,首先创建一个字符指针,然后使用malloc动态分配内存。由于bitArray2是一个char指针,因此它的大小为8而不是2.在传递arguements时会创建一个新的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;
}