尝试将char数组作为函数的参数传递,但不传递它。具体来说,尝试传递unsigned 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
谢谢!
答案 0 :(得分:4)
您应该关注的第一个警告信号是:
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
并允许衰减为指针。
您还可以删除下一个可疑的演员:
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]);
等等。
作为一般规则,应避免演员阵容。你的问题说明了一个经典错误。编译器告诉你你犯了一个错误。您将错误消息误解为表示您需要强制转换,因此添加强制转换。演员没有修复错误,它只是抑制编译器错误。现在你得到了编译器无法帮助你的错误,生活突然变得更加复杂。
你的目标应该是使这个代码免于演员表。
答案 1 :(得分:0)
在你的代码中unsigned char *p[8];
意味着p是一个指向8个unsigned char *数组的指针。当p传递给函数setlsbs()函数时,传递数组位置0的unsigned char *!并且尚未分配该值。那一刻哪个将是垃圾!在你的情况下它是0!
如果您只想生成8个字节的数组,请尝试unsigned char p[8];
,然后将指针p传递给函数setlsbs()函数。然后尝试打印p [0]。你会得到正确的结果。
您可以在此链接中查看unsigned char *p[8]
和unsigned char (*p)[8]
的区别:
Difference between *ptr[10] and (*ptr)[10]
我希望这可以帮助您解决问题。