Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在结构中用固定数组映射可变内存块_C_Arrays_Struct - Fatal编程技术网

C 在结构中用固定数组映射可变内存块

C 在结构中用固定数组映射可变内存块,c,arrays,struct,C,Arrays,Struct,Visual Studio不会抱怨访问超过13字节的固定数组,这是不可取的吗?我的意图是通过对具有内置头的结构使用直接内存写入来避免处理文件IO中的头。为标题道歉\ 在结构的末尾定义一个零长度数组有一个技巧。然后,您可以分配sizeof结构加上所需数组的大小,得到任意大小的数组,在运行时而不是编译时决定。以下是一些关于它的信息: 注意事项: 您必须分配正确的内存量。即使没有分配内存,也可以访问结构之外的内存。但这是代码中的一个bug。内存可能用于其他用途,或跨越边界等。最坏的情况是,它将覆盖其

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

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

注意事项:

  • 您必须分配正确的内存量。即使没有分配内存,也可以访问结构之外的内存。但这是代码中的一个bug。内存可能用于其他用途,或跨越边界等。最坏的情况是,它将覆盖其他一些数据,直到程序的其他部分出现异常行为,您才会发现它。永远不要使用未分配的堆内存

  • 分配后,如果不
    realloc
    调整整个结构+数组大小,则无法调整数组大小

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

  • 确保您知道数组的长度。可以将长度存储在结构中的一个字段中,并进行自己的边界检查,以确保指针算法(/array index access)不会出错


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

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

    注意事项:

  • 您必须分配正确的内存量。即使没有分配内存,也可以访问结构之外的内存。但这是代码中的一个bug。内存可能用于其他用途,或跨越边界等。最坏的情况是,它将覆盖其他一些数据,直到程序的其他部分出现异常行为,您才会发现它。永远不要使用未分配的堆内存

  • 分配后,如果不
    realloc
    调整整个结构+数组大小,则无法调整数组大小

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

  • 确保您知道数组的长度。可以将长度存储在结构中的一个字段中,并进行自己的边界检查,以确保指针算法(/array index access)不会出错

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

    这称为。这称为。
    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 );
    }