malloc()真正做什么?
为了更好地理解malloc()和realloc(),我尝试运行以下代码:malloc()真正做什么?,c,string,memory,C,String,Memory,为了更好地理解malloc()和realloc(),我尝试运行以下代码: #include <stdio.h> #include <stdlib.h> #include <string.h> int main () { char *str; str = malloc(20); str = strcpy(str, "inf110_malloc_test"); printf("String = %s, Address = %u\n",
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main () {
char *str;
str = malloc(20);
str = strcpy(str, "inf110_malloc_test");
printf("String = %s, Address = %u\n", str, str);
str = realloc(str, 25);
str = strcat(str, " is dene perfectly.");
printf("String = %s Address = %u\n", str, str);
free(str);
return(0);
}
问题是,即使我将NULL
参数传递给malloc()
,代码也运行得很好
我在cplusplus.com上读到以下内容:
为避免溢出,目标指向的数组的大小应足够长,以包含与源相同的C字符串(包括终止的空字符),并且在内存中不应与源重叠
为什么程序在这一点上没有崩溃?strcpy()
是否自动分配足够的内存
问题是,即使我通过了NULL
malloc()
的参数
是的,毫不犹豫
realloc
'ed内存字段可以位于malloc
'ed字段的同一地址,也可以位于新的内存地址,这取决于移动数据后内存中的空间是否足够
我会更好地理解,并且更愿意写
realloc(20+5)
,因此。C不会阻止你射中自己的脚。而且它也不能保证当你这样做的时候会发生什么。这在C中被称为“未定义行为”。当遇到UB时,程序可能会崩溃,或者看起来正常工作,或者出现任何其他行为。它确实感谢您@KayLUME不要用C和C++来标注问题,除非你询问语言之间的差异或它们之间的交互,例如从另一个调用例程。人们可能会计算错误,这在某些情况下可能会造成严重的危险@无用的情况下,错误计算内存需求可能会导致程序出现严重问题。然而,C和C++标准都不需要C或C++的实现来保护你。这些标准没有定义数组溢出时发生的情况。当发生这种情况时,允许C和C++实现崩溃,并且允许它们破坏内存。大多数实现都不会花费太多精力来检测数组溢出,只有当您的程序尝试内存映射不允许的内存访问时,它才会崩溃。
String = inf110_malloc_test, Address = 1840192
String = inf110_malloc_test is dene perfectly. Address = 1840192
...
str = malloc(NULL);
...