VMi*_*VMi 0 c malloc pointers char
在C语言中进行动态内存分配时,将内存大小分配给char指针时,我感到困惑。虽然我只给出1个字节作为限制,但鉴于每个字母对应于1个字节,char指针成功地尽可能长地获取了输入。
我也试图找到输入前后的指针大小。有人可以帮我了解这里发生了什么吗?输出使我感到困惑。
看下面的代码:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int limit;
printf("Please enter the limit of your string - ");
gets(&limit);
char *text = (char*) malloc(limit*4);
printf("\n\nThe size of text before input is %d bytes",sizeof(text));
printf("\n\nPlease input your string - ");
scanf("%[^\n]s",text);
printf("\n\nYour string is %s",text);
printf("\n\nThe size of char pointer text after input is %d bytes",sizeof(text));
printf("\n\nThe size of text value after input is %d bytes",sizeof(*text));
printf("\n\nThe size of ++text value after input is %d bytes",sizeof(++text));
free(text);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
之所以有效,是因为malloc通常不会分配您传递给它的相同数量的字节。它保留多个“块”的内存。它通常会保留更多内存,以“缓存”它以供下一次malloc调用,以实现优化。(这是特定于实现的)例如检查 glibc malloc内部。
使用比malloc分配的内存更多的内存是未定义的行为。您可能会覆盖保存在堆上的malloc的元数据或破坏其他数据。
我也试图找到输入前后的指针大小。有人可以帮我了解这里发生了什么吗?输出使我感到困惑。
对于机器中的所有指针类型,指针的大小是固定的,取决于地址大小,通常为4/8字节。它与数据大小无关。