realloc在这段代码中做了什么?

时间:2014-09-26 17:48:49

标签: c malloc realloc

我正在浏览C here 中的relloc示例。我无法确切地知道realloc()在这个片段中做了什么,因为即使我注释掉了realloc语句,程序也运行得很好。我再次在此处附加代码,以便更容易完成。

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

int main()
{
char *str;

/* Initial memory allocation */
str = (char *) malloc(15);
strcpy(str, "tutorialspoint");
printf("String = %s,  Address = %u\n", str, str);

/* Reallocating memory */
str = (char *) realloc(str, 25);
strcat(str, ".com");
printf("String = %s,  Address = %u\n", str, str);

free(str);

return(0);
}

据我所知,malloc()最初将字符串分配为15个字节长,然后realloc()将其重新分配为25个字符长。但即使我从片段中删除realloc()语句,它仍然可以正常工作?我错过了什么吗?

1 个答案:

答案 0 :(得分:2)

  

但即使我从代码段中删除realloc()语句,它仍然可以正常工作吗?

如果删除realloc(),可能代码工作正常,但这是一个意外。代码仍然是错误的,它有一个缓冲区溢出,结果是&#34;未定义的行为&#34; - 这意味着它可能正常工作,它可能会崩溃,它可能会给出错误的答案,它可能会格式化您的硬盘 - 它可能会任何

修复您的代码。

如果您使用GCC 4.8或更新版本,我建议使用地址清洁剂。像这样编译你的代码:

gcc main.c -o main -fsanitize=address -Wall -Wextra
                   ^^^^^^^^^^^^^^^^^^

这需要在您的系统上安装地址清理程序库。或者,在Valgrind的memcheck工具中运行您的代码。

valgrind ./main

这两个工具都会显示您的程序错误。