C动态成员结构

时间:2016-04-14 20:26:44

标签: 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 ++制作它会得到不同的结果吗?

1 个答案:

答案 0 :(得分:3)

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

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

你真正在做的是说,“在内存中333 * sizeof(int)的位置后,将{50}写入sign_h字节的4个字节.C表示”OK,done“,无论后果。

说到后果,可能会有很多负面因素,包括:

  1. 如果再次调用malloc,它可能会返回一个内存块,其中包含您刚写入内存的位置。如果是这样,你可能会破坏你刚写的价值。如果您之前调用过malloc,也可能会发生这种情况。
  2. 你可能会发生段错误。 Malloc拥有自己的数据结构,用于维护有关分配给用户的内存块的信息。通过写入一些随机的,任意的空间,你可能会破坏malloc的数据结构。
  3. 基本上,不要使用你没有要求的记忆。