#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 字节)超出范围。
我是一名优秀的程序员,十分优秀!