【问题标题】:Passing an unsigned char array as a parameter - array not correctly passing将无符号字符数组作为参数传递 - 数组未正确传递
【发布时间】:2014-11-13 04:36:28
【问题描述】:

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

谢谢!

【问题讨论】:

  • //make array for eight bytes - unsigned char *p[8] 不。那是八个 指针 (尽管它的大小肯定超过 8 个八位字节)。
  • 你有没有停下来思考一下为什么这个演员阵容是必要的 - (unsigned char*)(rand()%255)?在编译器关闭之前,转换不是你扔给编译器的东西。
  • @WhozCraig - 谢谢。固定。
  • @Praetorian - 谢谢。我仍然在学习很多关于 C 的知识。我已经改变了这一点,并将在未来牢记这一点。谢谢。
  • 这一行:unsigned char *p[8];创建一个由 8 个指针组成的数组,其中的指针没有它们所指向的具体事物。

标签: c arrays function pointers parameters


【解决方案1】:

您应该关注的第一个警告信号在这里:

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]);

等等。


作为一般规则,应避免强制转换。你的问题说明了一个典型的错误。编译器告诉你你犯了一个错误。您将错误消息误解为表明您需要演员表,因此添加演员表。强制转换不能修复错误,它只是抑制编译器错误。现在您遇到了编译器无法帮助您解决的错误,生活突然变得复杂了很多。

您的目标应该是使此代码免于强制转换。

【讨论】:

    【解决方案2】:

    在您的代码unsigned char *p[8]; 中,p 是指向 8 个无符号字符 * 的数组的指针。当 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]

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-14
      • 2020-05-01
      • 2014-09-06
      • 2015-08-18
      • 2012-11-15
      • 1970-01-01
      • 2019-01-07
      • 2012-07-17
      相关资源
      最近更新 更多