C动态成员结构

Posted

技术标签:

【中文标题】C动态成员结构【英文标题】:C dynamic member structure 【发布时间】:2016-04-14 20:26:43 【问题描述】:

动态内存分配有一个奇怪的问题。 每当我动态分配只有一个int 的结构成员时,我可以写很多我想要的而不是像普通变量而不是数组那样只有一个int。 这是我的代码,带有一些评论,也许你可以告诉我我做错了什么或者我跳过了哪一点:

#include <stdio.h>
#include <stdlib.h>

typedef struct
    int *sign_h;
    int max_chars;
 myformat;

int main()

    myformat *myfile=malloc(sizeof(myformat)); // one struct
    myfile->max_chars=100;
    myfile->sign_h=malloc(1*sizeof(int)); //size of one int
    myfile->sign_h[333]=50; //Is this suppose to work?
    printf("test %d",myfile->sign_h[333]); // printf print value of 50 
    FILE* f1=NULL;
    char nume[]="myfile.bin";
    f1=fopen(nume,"wb");
    fwrite(&myfile,sizeof(myformat),1,f1);
    fclose(f1);
    return 0;

PS:那么 C++ 呢?如果我用 C++ 实现,我会得到不同的结果?

【问题讨论】:

恭喜,您发现缓冲区溢出 未定义的行为是未定义的。 语言并不能阻止你朝自己的脚开枪,所以你有责任避免这样做。 也许阅读pointer arithmetic 会很有价值。 C 和 C++ 对这里发生的事情非常一致:未定义。 【参考方案1】:

C 不在乎你是否注销了数组的末尾,它只是遵循命令。当你打电话时

    myfile->sign_h[333]=50; //Is this suppose to work?

你真正在做的是说,“在内存中sign_h 的位置之后的 4 个字节中写入 50 个 333 * sizeof(int) 字节。C 说,“OK,完成”,不管后果如何。

说到后果,这样做可能会有很多负面影响,包括:

    如果您再次调用 malloc,它可能会返回一块内存,其中包含您刚刚写入内存的位置。如果是这样,您可能会破坏您刚刚写入的值。如果您之前调用过 malloc,也可能会发生这种情况。 您可能会出现段错误。 Malloc 在底层拥有自己的数据结构,用于维护有关分配给用户的内存块的信息。通过写入一些随机的任意空间,您可能会破坏 malloc 的数据结构。

基本上,不要使用你没有要求的内存。

【讨论】:

以上是关于C动态成员结构的主要内容,如果未能解决你的问题,请参考以下文章

具有动态分配成员的动态分配结构的 MPI 派生数据类型

通过成员为动态数组的函数初始化结构

将结构成员指针分配给另一个动态内存分配的指针是不是安全?

C ++ Mixin - 初始化期间的动态绑定习语

为包含动态数组的结构创建 MPI 类型

csharp C#动态对象嵌套成员调用