使用结构中的固定数组映射变化的内存块

时间:2012-07-05 18:35:45

标签: c arrays struct

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中的标头。道歉的标题。 :\

1 个答案:

答案 0 :(得分:1)

您可以在结构的末尾定义零长度数组。然后,您可以分配sizeof结构加上所需数组的大小,并获得所需大小的数组,在运行时决定,而不是在编译时决定。以下是一些信息:

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

注意事项:

  1. 您必须分配适量的内存。即使您没有分配它,您也可以访问struct之外的内存。但这是你的代码中的一个错误。内存可以用于其他东西,或者跨越边界等。最坏的情况是它会覆盖其他一些数据,直到程序的其他部分表现得很奇怪才会发现它。切勿使用未分配的堆内存。

  2. 分配后,如果没有realloc整个struct +数组大小,则无法调整数组大小。

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

  4. 确保您知道阵列的长度。也许将长度存储在struct中的一个字段中并进行自己的边界检查,以确保你的指针算法没有出错(/ array index access)。

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