Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
malloc()真正做什么?_C_String_Memory - Fatal编程技术网

malloc()真正做什么?

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",

为了更好地理解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", 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);
...