c - 将无符号字符数组作为参数传递 - 数组未正确传递

标签 c arrays function pointers parameters

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

相关文章:

c++ - C++ 函数中的复杂参数 - 指针、引用或...?

c++ - C/C++ 中的对象在程序退出后会被垃圾回收吗?

vb.net - 函数不会在所有代码路径上返回值。使用结果时,可能会在运行时发生空引用异常

c - 链接两个目标文件以生成一个二进制文件

c++ - C++数组下标差异

php - 显示每个卧室数量的图标(酒店网站)php

c++ - getline 超过指定数量

c# - C#函数执行时异步等待

c - C 中的指针数组及更多内容

c - 奇怪的 C 行为