我有一个关于为c中的结构分配内存的一个相当简单的问题,我试过在网上看,但我找不到任何东西.结构定义为:
typedef struct cblock_ {
....
} cblock, *Cblock;
Run Code Online (Sandbox Code Playgroud)
分配内存时,我试过了
Cblock new_block = malloc(sizeof(struct cblock_));
Run Code Online (Sandbox Code Playgroud)
但是,我不断收到内存损坏错误.我已经尝试将sizeof的参数更改为不同的东西,但一切都得到了相同的内存损坏错误.我究竟做错了什么?
****编辑****
因此在运行valgrind之后,我在代码中得到了相当多的"无效写入大小4"或"无效读取大小4".
发布所有内容可能太多了,但这里有一个地方,其中valgrinds给我一个"4号无效写入"
static Ablock agroup_main;
typedef struct ablock_ {
int length;
int num;
...
} ablock, *Ablock;
void init_groups() {
agroup_main = malloc(sizeof(Ablock));
agroup_main->length = DEFAULT_GROUP_LENGTH;
agroup_main->num = DEFAULT_GROUP_NUM;
}
Run Code Online (Sandbox Code Playgroud)
Valgrind在行设置长度上说它是大小为4的无效写入,并且在分配大小为4的块之后地址是0字节.对于num,它是相同的,除了地址是大小为4的块之后的4个字节.我也不太明白这一点,因为长度只是一个int,而对我来说,错误听起来像我想为它分配内存......
内存损坏可能是因为较早的错误malloc(例如,尺寸太小),过早free或真正的缓冲区溢出(或未初始化的指针取消引用).
使用内存泄漏检测器.在Linux上,尝试valgrind
您malloc为Cblock看起来确定.这个bug可能在其他地方.不要忘记编译所有警告和调试信息(例如gcc -Wall -g).还可以使用调试器(例如gdb).您可能希望禁用ASLR以简化调试(并且具有更多可重现的运行).
你应该测试结果malloc:
cblock* new_block = malloc(sizeof(struct cblock_));
if (!new_block) {
perror("malloc cblock");
exit(EXIT_FAILURE);
}
Run Code Online (Sandbox Code Playgroud)
而且我认为你应该清楚地标记你代码中的所有指针(所以我更喜欢cblock*而不是Cblock让我感到困惑,哪些应该至少被命名CblockPtr).
顺便说一下,你被这种混乱所困扰:
agroup_main = malloc(sizeof(Ablock)); // WRONG!
Run Code Online (Sandbox Code Playgroud)
是不正确的,因为Ablock是一个指针类型(在Linux/PC上,所有指针都有相同的大小,在x86-64上是8个字节).你的意思是
agroup_main = malloc(sizeof(ablock));
if (!agroup_main)
{ perror("malloc ablock"); exit (EXIT_FAILURE); };
Run Code Online (Sandbox Code Playgroud)
你真的应该放弃以隐藏指针的方式命名指针类型的坏习惯(并且使用类似于指向数据的名称).