c语言 - 我对动态内存分配没有正确的理解。为什么 malloc(1) 接受任何大小的字符串?



我正试图更深入地理解动态内存分配。此代码不能正常工作。这只是对我自己理解的破坏性测试

大家好。我在这里努力学习,但我很挣扎。我的假设是,当我创建一个字符串,如

char test[] = "Hello World!!!";

然后,在编译时,为上面的字符串加上null字符,有15个字节分配给内存。如果我需要一个两倍大的字符串,我可以简单地做这个

char *testPtr = malloc(strlen(test) * 2);

并且30个字节将被分配给堆,并且一切都是好的。但是,我认为这是错误的想法。或者,还有一点我还没有掌握的信息。这种混乱的来源是这个代码

char *test = malloc(1);
strcpy(test, "Hello World!!!");
printf("nn%snn", test);
free(test);

如果我运行这个,它实际上会给我字符串";你好,世界"这对我来说毫无意义。我知道char x = 'c';为堆栈分配了1个字节。但是,单个字节表示"c",但x存储在哪里?如果我将内存分配给指针,那么该内存如何可用?如果我要写char *test = malloc(4);,有多少个字符(1字节(可以到达那里?它们都存储在堆上、堆栈上还是两者的混合?为什么上面的代码malloc(1(允许指针中有1个以上的字符?如果一个指针包含8个字节,那么使用这8个字节究竟是什么?这是变量名所在的8个字节,还是指针所在的数据?最后,变量名+类型与数据存储在哪里,内存是如何分配的,即程序员能够控制和操作什么?很抱歉出现了这样的问题,但很多这样的问题都会同时出现。提前感谢所有能够回答这些问题的C向导!

C不会阻止您使用不属于自己的内存。你分配了1个字节,但你使用了15个字节,所以你在占用别人的内存。这是未定义的行为。

最新更新