2016-04-14 145 views
-1

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

#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++编写它,我会得到不同的结果?

+5

恭喜你,你已经发现缓冲区溢出 –

+0

未定义的行为是未定义的。 – EOF

+2

语言不会阻止你在脚下射击自己,所以你有责任避免这样做。 – jamesdlin

回答

3

C不关心你是否写出数组的末尾,它只是遵循命令。当你调用

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

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

后果的说到,可能有许多负面的做那,包括:

  1. 如果您再次调用malloc的,它可能给你回的内存块包含,你只写给记忆,如果是这样,你可能会破坏价值你刚才写道。如果你以前打电话给malloc,这也可能发生。
  2. 你可以segfault。 Malloc拥有自己的数据结构,用于维护分配给用户的内存块信息。通过写入一些随机的,任意的空间,你可能会破坏malloc的数据结构。

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