C++ 二进制操作数无效*

C++ 二进制操作数无效*,c++,c,malloc,buffer,C++,C,Malloc,Buffer,我一直收到一个错误,该错误表示二进制*的无效操作数具有无符号int'和'struct\u IO\u FILE*。结构是在函数外部定义的,因此它是通用的。缓冲区是在main中定义的。如果需要,我可以提供更多的代码。我有什么问题 编辑:好吧,显然我有点困惑。我要做的是传入一个文件,然后为该文件分配足够的空间。我曾考虑使用一个文件函数来传递文件,然后使用它,但希望只使用stdin。这是不允许的吗?这是在C.,只是贴上了C++的标签,希望其他人也能看到类似的问题。 对不起,这个愚蠢的问题。对C整体来说不

我一直收到一个错误,该错误表示二进制*的无效操作数具有无符号int'和'struct\u IO\u FILE*。结构是在函数外部定义的,因此它是通用的。缓冲区是在main中定义的。如果需要,我可以提供更多的代码。我有什么问题

编辑:好吧,显然我有点困惑。我要做的是传入一个文件,然后为该文件分配足够的空间。我曾考虑使用一个文件函数来传递文件,然后使用它,但希望只使用stdin。这是不允许的吗?这是在C.,只是贴上了C++的标签,希望其他人也能看到类似的问题。 对不起,这个愚蠢的问题。对C整体来说不是新的,但对malloc来说是新的。二年级学生:P

我想你想从标准文本中读取像素数:

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

int n;
scanf("%d", &n);
分配内存的正确方法如下

unsigned char * buffer = (unsigned char *) malloc (sizeof(pixel) * n );
在C中,铸造malloc的结果被认为是不好的做法1。这是不必要的,因为void*的值可以分配给任何指针类型,并且在C89编译器中,如果您忘记包含stdlib.h或在范围中没有malloc声明,它可以禁止诊断

此外,由于表达式*缓冲区具有类型pixel,因此表达式sizeof*缓冲区等效于sizeof pixel。如果缓冲区类型发生变化,这可以节省一些维护时间

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

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
}
等等。
1.与C++相比,它是需要的,但是如果你正在编写C++,你应该使用新的操作符。是的,你会看到成千上万的例子,包括演员阵容。您还将看到数千个使用voidmain的示例。大多数C引用都是垃圾

那完全没有道理。或者你想从stdin那里得到一些信息?然后你必须用例如scanf来阅读它。至于int*的转换,你为什么这么做?你不想要一个像素结构的数组吗?为什么要通过stdin?而且,编译器正在做您告诉它做的事情,而不是您期望它做的事情。在本例中,您期望stdin给您什么?它是一个文件,代表键盘或终端、控制台或任何你称之为它的东西。我猜你想知道输入有多大,但如果是这样的话,你实际上必须先阅读它…你认为这意味着什么:buffer=int*malloc sizeofpixel*stdin;???为了得到文件的长度,有10亿篇关于这个的帖子。这里有一个:stdin>>n?C++中的MALOC?而缓冲区不是指针。@ JoachimPileborg抱歉,卡在C++模式下,更改答案为C.处理了很多错误。但仍然无法将stdin扫描到其中。我如何在stdin中扫描到%d,因为我没有声明n=to%d。声明int n;如上所述。
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
}
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 );
    }
  }
}
10 20 30
40 50 60