传递unsigned char数组作为参数 - 数组未正确传递

时间:2014-11-13 04:36:28

标签: c arrays function pointers parameters

尝试将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

谢谢!

2 个答案:

答案 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]

我希望这可以帮助您解决问题。