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
答案 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 );
}
}
}
等。
10 20 30
40 50 60
运算符。是的,您将看到包含演员表的数千个示例。您还将看到数千个使用new
的示例。大多数C引用只是 crap 。