Parameters 调用free()方法后出现分段错误,但仅限于某些值

Parameters 调用free()方法后出现分段错误,但仅限于某些值,parameters,malloc,free,behavior,Parameters,Malloc,Free,Behavior,我用C编写了一个简单的小程序,我发布了它的代码: #include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char *argv[]){ char *char_ptr; int *int_ptr; int mem_size; if (argc<2) { mem_size = 50; } else { mem_size = atoi(argv[1]);

我用C编写了一个简单的小程序,我发布了它的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[]){

char *char_ptr;
int *int_ptr;
int mem_size;

if (argc<2) {
mem_size = 50;
}
else
{
mem_size = atoi(argv[1]);
}

printf("\t[+] allocating %d bytes of memory on the heap for char_ptr\n", mem_size);
char_ptr = (char *) malloc(mem_size);
if(char_ptr == NULL) {
fprintf(stderr, "Error: could not allocate heap memory.\n");
exit(-1);
}
strcpy(char_ptr, "This memory is in the heap segment");
printf("char_ptr (%p) -> '%s'\n", char_ptr, char_ptr);

printf("\t[+] allocating 12 bytes of memory on the heap for int_ptr\n");
int_ptr = (int *)malloc(12);

if(int_ptr == NULL){
fprintf(stderr, "Error: could not allocate heap memory.\n");
exit(-1);
}

*int_ptr = 31337;

printf("int_ptr (%p) --> %d\n", int_ptr, *int_ptr);
printf("\t[-] freeing char_ptr's heap memory...\n");
free(char_ptr);

printf("\t[+] allocating another 17 bytes for char_ptr\n");
char_ptr = (char *) malloc(17);

if(char_ptr == NULL){
fprintf(stderr, "Error: could not allocate heap memory.\n");
exit(-1);
}

strcpy(char_ptr, "New Memory");
printf("char_ptr (%p) --> '%s'\n", char_ptr, char_ptr);
printf("\t[-] freeing int_ptr's heap memory.\n");
free(int_ptr);
printf("\t[-] freeing char_ptr's memory\n");
free(char_ptr);
printf("Program exiting\n");
return 0;
}
#包括
#包括
#包括
int main(int argc,char*argv[]){
char*char_ptr;
int*int_ptr;
内部内存大小;

如果(argc复制到char_ptr内存中的第一个字符串(
“此内存在堆段中”
)的长度为35字节,包括终止的NUL字节。这将损坏堆中小于35的所有参数


只是碰巧,它对您的影响降到了29,因为free可能不依赖于数据覆盖。

Hi Johannes首先,感谢您的回复!我实际上有些怀疑。当我分配一个小于35字节的内存大小时,问题就出现了,因为它试图在较短的内存范围内容纳35字节长的字符串……这是一个错误我没有注意到。但是我不明白为什么错误发生在程序的末尾。我的意思是,代码在最后一个free()之前做了一些malloc-free的事情这导致了错误。我无法理解为什么会出现。以及它如何在值小于35但大于28的情况下运行。我将尝试解决它,您给了我一个重要的建议,非常感谢!这是因为
free()
不检查堆的所有内部数据,而只是围绕它需要的指针旋转。对于一些完全不相关的
free()
崩溃。在您的情况下,您正在覆盖
char\u ptr
块后面的内存块的元数据。无法确定这将是什么。
malloc()
free()
在内部使用几个不同的内存池以提高速度,这使得它们很难预测。在您的情况下,我假设您只是简单地覆盖了
int\u ptr
块的元数据,因此在释放该块时会发生崩溃。请使用适当的缩进将代码格式化一点,以便于阅读。另外,请添加堆栈跟踪,t这有助于找到问题所在。