gpt4 book ai didi

c - 检测到堆损坏(使用 MSVC 构建时报告,但使用 GCC 构建时不报告)

转载 作者:太空宇宙 更新时间:2023-11-04 08:31:52 24 4
gpt4 key购买 nike

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

typedef struct
{
char *string;
int end;
size_t length;
} str;

str* new_string(size_t len)
{
str *ptr;

ptr = (str*) malloc(sizeof(str));

ptr->string = (char *)malloc(sizeof(char) * len);
ptr->length = len;

ptr->string[len] = '\0';
ptr->end = 0;

return ptr;
}



void resize_string(str *ptr, size_t new_size)
{
ptr->string = (char *)realloc(ptr->string, sizeof(char) * new_size);

if (ptr->end == ptr->length) {
ptr->string[ptr->length] = ' ';
ptr->string[new_size] = '\0';
}
ptr->length = new_size;
}

void append_string(str *ptr, char ch)
{
if (ptr->end == ptr->length) {
size_t new_length = ptr->length + 5;
resize_string(ptr, new_length);
}

ptr->string[ptr->end] = ch;
ptr->end++;
ptr->string[ptr->end] = '\0';
}

char *raw_string(str *ptr)
{
return ptr->string;
}

void delete_string(str *ptr)
{
if (ptr != NULL) {
if (ptr->string != NULL) {
free(ptr->string); //deugger here is showing the break statement and HEAP CORRUPTION DETECTED.
}
free(ptr);
}
}

int main() {
char ch;
str *string = new_string(5);
while (1) {

ch = getchar();

if(ch=='\n'){

break;
}

append_string(string, ch);
}

printf("%s",raw_string(string));
delete_string(string);

return 0;
}

以上代码在 ubuntu 中运行良好,没有任何段。故障,但在 visual studio 2013 中,代码在运行时崩溃。当我尝试 free(ptr->string) 和 HEAP CORRUPTION DETECTED 时,调试器显示 break 语句,但我不明白为什么?

最佳答案

听起来您应该在基于 gcc 的环境中启用已检查的分配,您会发现无论底层库如何,您都会破坏堆。

就是说,您重新分配的数量比预期的少 1,例如索引“new_size”(在其后设置 NUL 字节)超出范围。

关于c - 检测到堆损坏(使用 MSVC 构建时报告,但使用 GCC 构建时不报告),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27971506/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com