我正试图更深入地理解动态内存分配。此代码不能正常工作。这只是对我自己理解的破坏性测试
大家好。我在这里努力学习,但我很挣扎。我的假设是,当我创建一个字符串,如
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个字节,所以你在占用别人的内存。这是未定义的行为。