在使用 C 进行动态内存分配时,我在将内存大小分配给 char 指针时感到困惑。虽然我只给出 1 个字节作为限制,char 指针成功地接收尽可能长的输入,假定每个字母对应 1 个字节。
我还尝试查找输入前后指针的大小。我怎样才能理解这里发生了什么?输出让我感到困惑。
看这段代码:
#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;
}
检查这个输出:
它之所以有效,是因为 malloc 通常不会分配与您传递给它的相同数量的字节。
它保留多个“块”的内存。作为一种优化,它通常会保留更多内存来“缓存”下一次 malloc 调用。 (这是一个具体的实现)
查看glibc malloc 内部结构 https://sourceware.org/glibc/wiki/MallocInternals例如。
使用比 malloc 分配的内存更多的内存是一种未定义的行为。您可能会覆盖保存在堆上的 malloc 元数据或损坏其他数据。
我还尝试查找输入前后指针的大小。如何
我能理解这里发生了什么吗?输出让我感到困惑。
机器中所有指针类型的指针大小都是固定的,通常为 4/8 字节,具体取决于地址大小。它与数据大小没有任何关系。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)