1
struct image_struct {
    unsigned int width;
    unsigned int height;
    char mode;
    char depth;
    unsigned char data[13];
}

image_struct* newImage( unsigned int width, unsigned int height, char depth ) {

    image_struct* image = (image_struct*)malloc(
        sizeof(image_struct) - 13 + width * height * depth );

    return( image );
}

Visual Studio 不会抱怨访问超过 13 个字节的固定数组,这是不可取的吗?我的意图是通过对带有内置头文件的结构使用直接内存写入来避免处理文件 IO 中的头文件。为标题道歉。:\

4

1 回答 1

1

您可以使用一个技巧,在结构的末尾定义一个零长度数组。然后,您可以分配sizeof结构加上您想要的数组的大小,并获得您想要的任何大小的数组,在运行时而不是编译时决定。以下是有关它的一些信息:

http://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html

注意事项:

  1. 您必须分配适量的内存。即使您没有分配它,您也可以访问结构之外的内存。但这是您代码中的一个错误。内存可能用于其他用途,或跨越边界等。最坏的情况是它会覆盖其他一些数据,并且您不会发现它,直到您的程序的某些其他部分表现异常。永远不要使用你没有分配的堆内存。

  2. 分配后,您无法调整数组的大小,而不realloc需要整个 struct + 数组的大小。

  3. 数组必须是数组的最后一个元素

  4. 确保您知道数组的长度。也许将长度存储在结构中的字段中并进行自己的边界检查,以确保您的指针算法(/数组索引访问)不会出错。

这仅适用于在堆上分配的结构,而不适用于堆栈上的自动变量。

于 2012-07-05T18:40:04.943 回答