二进制的无效操作数*

时间:2013-09-05 16:59:08

标签: c++ c malloc buffer

typedef struct pixel_type
   {
      unsigned char r;
      unsigned char g;
      unsigned char b;
   }  pixel;     



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

我一直收到一条错误,指出“二进制*的操作数无效(有unsigned int'和'struct _IO_FILE *)。”结构在函数之外定义,因此它是通用的。缓冲区在main中定义。如果需要,我可以提供更多代码。我的问题是什么?

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

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

2 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:0)

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

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或者没有{{1}的声明,它可以禁止诊断在范围内。

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

如何获得阵列的元素数量取决于您的应用程序。最简单的方法是将该值保留在数据文件的头部:

buffer

当然,这假设您的数据文件被构造为3个整数值的行,如

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

等。

<小时/> 1。与C ++相反,它是必需的,但如果您正在编写C ++,那么您应该使用10 20 30 40 50 60 运算符。是的,您将看到包含演员表的数千个示例。您还将看到数千个使用new的示例。大多数C引用只是 crap

相关问题