c++ - C动态成员结构

标签 c++ c memory struct

我在动态内存分配方面遇到了一个奇怪的问题。 每当我动态分配只有一个 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++ 实现,我会得到不同的结果?

最佳答案

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

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

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

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

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

基本上,不要使用您未请求的内存。

关于c++ - C动态成员结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36633332/

相关文章:

c++ - vs2010中的 vector 初始化

c++ - Win32 - 将文本附加到编辑控件

c++ - 如何删除一个空的对象数组?

c - 持有相同 Node 结构地址的两个指针打印不同的值

memory - 一旦被 bytes.Buffer 占用,就无法释放内存

c++ - 为什么在释放内存后使用的内存量仍然增加?

c++ - 带有 phreads 的程序可以工作一段时间然后停止

c++ - Valgrind 发现了 3 个内存泄漏,但我不知道它们在哪里

枚举类中的 C++ 运算符重载

c++ - 在 openCV 中将 cvPoint[][] 转换为 cvPoint** 时出现段错误