尝试将 char 数组作为函数的参数传递,但未传递。具体来说,尝试将无符号字符数组“p”传递给函数“setlsbs”(忽略函数的明显目的。目前只是尝试正确传递它)。
代码:
#include <stdio.h>
#include <stdlib.h>
#define BYTETOBINARYPATTERN "%d%d%d%d%d%d%d%d"
#define BYTETOBINARY(byte) \
(byte & 0x80 ? 1 : 0), \
(byte & 0x40 ? 1 : 0), \
(byte & 0x20 ? 1 : 0), \
(byte & 0x10 ? 1 : 0), \
(byte & 0x08 ? 1 : 0), \
(byte & 0x04 ? 1 : 0), \
(byte & 0x02 ? 1 : 0), \
(byte & 0x01 ? 1 : 0)
#define PRINTBIN(x) printf(BYTETOBINARYPATTERN, BYTETOBINARY(x));
void setlsbs(unsigned char* p, unsigned char b0);
unsigned char getlsbs(unsigned char *p);
//MAIN
int main(int argc, char **argv){
//default seed
long seed = 1234;
//if argv[1] available, use it as the seed instead
if(argv[1]){
sscanf(argv[1], "%ld", &seed);
}
//seed RNG
srand(seed);
//make array for eight bytes
unsigned char *p[8];
//fill array with random num 0-255
int cnt;
for(cnt = 0; cnt<8; cnt++){
p[cnt] = (unsigned char*)(rand()%255);
printf("p[%d] decimal:%d and binary:", cnt, p[cnt]);
PRINTBIN((int)p[cnt]);
printf("\n");
}
//make random num for b0
unsigned char b0 = (unsigned char)(rand()%255);
printf("b0 decimal:%d and binary:", b0);
PRINTBIN((int)b0);
printf("\n");
//call setlsbs
setlsbs((unsigned char*)p, (unsigned char)b0);
}
//SET LSBS
void setlsbs(unsigned char *p, unsigned char b0){
printf("p[0]: %d\n", p[0]);
}
//GET LSBS
unsigned char getlsbs(unsigned char *p){
}
结果:
p[0] decimal:243 and binary:11110011
p[1] decimal:175 and binary:10101111
p[2] decimal:32 and binary:00100000
p[3] decimal:230 and binary:11100110
p[4] decimal:117 and binary:01110101
p[5] decimal:189 and binary:10111101
p[6] decimal:29 and binary:00011101
p[7] decimal:227 and binary:11100011
b0 decimal:233 and binary:11101001
p[0]: 0
最后一行应该是 p[0]: 243
谢谢!
最佳答案
您应该关注的第一个警告信号在这里:
setlsbs((unsigned char*)p, (unsigned char)b0);
你为什么要选角?如果p
是您不需要强制转换的正确类型。你应该写:
setlsbs(p, b0);
当然,这不会编译,因为 p
是错误的类型。但现在你让编译器告诉你这一点。我们来看看p
:
unsigned char *p[8];
这是一个元素类型为 unsigned char*
的数组。根本不是你想要的。您需要声明一个数组,其元素类型为 unsigned char
:
unsigned char p[8];
然后您可以传递p
直接联系setlsbs
并允许它衰减为指针。
您还可以删除下一个可疑的 Actor :
p[cnt] = (unsigned char*)(rand()%255);
当您声明 p
时,您需要进行强制转换来抑制编译器错误。错误地。通过上面的声明,可以删除此强制转换:
p[cnt] = rand()%255;
虽然我怀疑你的意思可能是:
p[cnt] = rand()%256;
正如您所写,rand()%255
产生 [0..254]
范围内的值并且永远不会屈服255
.
然后您可以更改:
PRINTBIN((int)p[cnt]);
至
PRINTBIN(p[cnt]);
等等。
作为一般规则,应避免强制转换。你的问题说明了一个典型的错误。编译器告诉你你犯了一个错误。您将错误消息误解为表明您需要强制转换,因此添加了强制转换。强制转换不能修复错误,它只是抑制编译器错误。现在你遇到了编译器无法帮助你解决的错误,生活突然变得更加复杂。
您应该致力于使此代码免于强制转换。
关于c - 将无符号字符数组作为参数传递 - 数组未正确传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26901411/