C动态构件结构

C dynamic member structure

本文关键字:结构 构件 动态      更新时间:2023-10-16

我在动态内存分配方面遇到了一个奇怪的问题。每当我动态地分配一个只有一个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位置后的333 * sizeof(int)字节的4个字节。C说,"好的,完成了",不管结果如何。

说到后果,这样做可能会带来许多负面影响,包括:

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

基本上,不要使用你没有要求的记忆。