-5
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

4

2 回答 2

1

我认为您想从以下位置读取像素数stdin

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

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

unsigned char * buffer = (unsigned char *) malloc (sizeof(pixel) * n );
于 2013-09-05T17:06:33.480 回答
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 中,强制转换 of 的结果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

等等


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

于 2013-09-05T20:27:58.317 回答