C动态构件结构
C dynamic member structure
我在动态内存分配方面遇到了一个奇怪的问题。每当我动态地分配一个只有一个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说,"好的,完成了",不管结果如何。
说到后果,这样做可能会带来许多负面影响,包括:
- 如果您再次调用malloc,它可能会返回一块内存,其中包含您刚刚写入内存的位置。如果是这样的话,你可能会毁掉你刚刚写的价值。如果您之前曾调用malloc,那么这种情况也可能发生
- 你可能会犯错。Malloc有自己的数据结构,用于维护分配给用户的内存块信息。通过写入一些随机、任意的空间,您可能会破坏malloc的数据结构
基本上,不要使用你没有要求的记忆。
相关文章:
- 如何循环打印顶点结构
- 通过方法访问结构
- 使用不带参数的函数访问结构元素
- 预处理器:插入结构名称中的前一个行号
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 孤立代码块在结构中引发异常
- 有什么方法可以遍历结构吗
- 如何在 C# 中映射双 C 结构指针?
- 如何在C++中使用结构生成映射
- 无法将结构注册为增强几何体3D点
- 多成员Constexpr结构初始化
- C++将文本文件中的数据读取到结构数组中
- 如何重构类层次结构以避免菱形问题
- 带有柔性阵列构件的包装结构的便携式替代方案
- 对齐构件的对齐结构为成员(C )
- 您如何使用成员正确初始化构造的结构,该构件是指向const值的const指针
- C动态构件结构
- 结构构件对齐方式C++/提升
- 替换大写结构中的每个构件
- 具有柔性阵列构件的结构C++ 'substitute'