【问题标题】:invalid operands to binary *二进制的无效操作数 *
【发布时间】:2013-09-05 16:59:08
【问题描述】:
typedef struct pixel_type
   {
      unsigned char r;
      unsigned char g;
      unsigned char b;
   }  pixel;     



buffer = (int *) malloc (sizeof(pixel) * stdin );

我不断收到一条错误消息,提示“二进制操作数无效*(具有无符号整数”和“struct _IO_FILE *)”。该结构是在函数之外定义的,因此它是通用的。缓冲区是在 main 中定义的。如果需要,我可以提供更多代码。我的问题是什么?

编辑:好吧,显然我有点困惑。我要做的是传入一个文件,然后为该文件分配足够的空间。我正在考虑使用 FILE 函数来传递文件,然后使用它,但希望只使用“stdin”。这是不允许的吗?这是用 C 语言编写的。只是标记了 C++,希望其他人可能会看到类似的问题。

抱歉这个愚蠢的问题。对整个 C 来说并不陌生,但对 malloc 来说却是新的。二年级学生:P

【问题讨论】:

  • 这根本没有任何意义。或者您想从stdin 获得一些意见?然后你必须阅读它,例如scanf。和int * 的选角,你为什么这样做?你不想要一个pixel 结构的“数组”吗?
  • 你为什么要传递stdin?而且,编译器正在做你告诉它做的事情,而不是你期望它做的事情。
  • 您希望stdin 在这种情况下能给您带来什么?它是一个FILE,代表键盘(或终端、控制台或任何你称之为的东西)。我猜你想知道“输入”有多大,但如果是这样的话,你实际上必须先阅读它......
  • 你认为这应该是什么意思:buffer = (int *) malloc (sizeof(pixel) * stdin );???
  • 为了获得文件的长度,有十亿条关于它的帖子。这是一个:stackoverflow.com/questions/238603/…

标签: c++ c malloc buffer


【解决方案1】:

我想你想读取来自stdin的像素数:

int n;
scanf("%d", &n);

然后为那么多像素分配内存:

unsigned char * buffer = (unsigned char *) malloc (sizeof(pixel) * n );

【讨论】:

  • stdin >> n?而malloc 在 C++ 中?而buffer 不是指针。
  • @JoachimPileborg 抱歉,卡在 C++ 模式,将答案改为 C。
  • 处理了很多错误。尽管如此,仍然无法将标准输入扫描到其中。我将如何在标准输入中扫描到 %d,因为我没有将 n = 声明为 %d。
  • 如上声明int n;
【解决方案2】:

分配内存的正确方法类似于

size_t elements = 0;

... // get the number of elements as a separate operation

pixel *buffer = malloc( sizeof *buffer * elements ); // note no cast, 
                                                     // operand of sizeof
if ( buffer )
{
   // load your buffer here
}

在 C 中,转换 malloc 的结果被认为是不好的做法1。这是不必要的,因为 void * 的值可以分配给任何指针类型,并且在 C89 编译器下,如果您忘记包含 stdlib.h 或在范围内没有 malloc 的声明,它可以抑制诊断。

此外,由于表达式*buffer 的类型为pixel,因此表达式sizeof *buffer 等价于sizeof (pixel)。如果buffer 的类型发生变化,这可以为您节省一些维护时间。

如何获取数组的元素数量实际上取决于您的应用程序。最简单的方法是将该值放在数据文件的开头:

size_t elements = 0;
FILE *data = fopen( "pixels.dat", "r" );
if ( !data )
{
  // You will want to add real error handling here.
  exit( 0 );
}

if ( fscanf( data, "%zu", &elements ) != 1 )
{
  // You will want to add real error handling here
  exit( 0 );
}

pixel *buffer = malloc( sizeof *buffer * elements );
if ( buffer )
{
  for ( size_t i = 0; i < elements; i++ )
  {
    if ( fscanf( data, "%hhu %hhu %hhu", // %hhu for unsigned char
                   &buffer[i].r, &buffer[i].g, &buffer[i].b ) != 3 )
    {
      // more real error handling here
      exit( 0 );
    }
  }
}

当然,这假定您的数据文件结构为 3 个整数值的行,例如

10 20 30
40 50 60

等等


1。与需要 C++ 的地方相反,但如果您正在编写 C++,则无论如何都应该使用 new 运算符。是的,您会看到数以千计的示例,其中包括演员表。您还将看到数千个使用void main() 的示例。大多数 C 引用只是 废话

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-24
    • 2021-12-15
    相关资源
    最近更新 更多