C 空间复杂性
如何获取运行时指针占用的空间想象一个类型,我将其称为“type”。可能是一个“int”,可能是一个奇特的结构C 空间复杂性,c,C,如何获取运行时指针占用的空间想象一个类型,我将其称为“type”。可能是一个“int”,可能是一个奇特的结构 type *p; sizeof(p)=指向p的指针的大小(即,存储“p”中数据所在地址所需的字节数。在PC上,可能是4或8个字节,这取决于您是采用32位还是64位体系结构,但这不能保证。在其他体系结构上,它几乎可以是任何东西) sizeof(*p)=类型p的尺寸;用于在“类型”中存储数据的字节数 重要提示: 您可能会看到这样做的代码: p = malloc(sizeof(*p)+
type *p;
sizeof(p)=指向p的指针的大小(即,存储“p”中数据所在地址所需的字节数。在PC上,可能是4或8个字节,这取决于您是采用32位还是64位体系结构,但这不能保证。在其他体系结构上,它几乎可以是任何东西)
sizeof(*p)=类型p的尺寸;用于在“类型”中存储数据的字节数
重要提示:
您可能会看到这样做的代码:
p = malloc(sizeof(*p)+100)
在这种情况下,将分配足够的内存来存储“type”和额外的100字节。但是,执行“sizeof(*p)”将返回“type”所需的内存,而不是额外的100字节。在C语言中无法知道分配了多少内存;您必须自己管理它。需要注意的一点是,您可以对类型本身而不仅仅是变量执行
sizeof
:
// Check if the pointer size of a generic data pointer is different
// than the pointer size of a function
if (sizeof(void *) != sizeof(int (*)()))
{
...
}
这个问题有点模棱两可,但我认为:
printf("Size of pointer is: %zu\n", sizeof(*p));
你应该做你想做的。%zu代替了%d,因为指针将是一个无符号整数。你知道你在问什么吗?标题与问题有什么关系?你们能把标题改一下吗?我想他问的是“我有一个指向某物的指针。我怎样才能得到某物的大小”。。。。OP,这是你的问题吗?你是说一个对象在一个特定指针上使用的内存量吗?指针大小可能会有很大的变化。我使用的嵌入式编译器有16位和24位指针。24位指针为地址分配16位,为指定内存类型分配8位(它用于哈佛体系结构芯片,如具有许多不同内存类型的8051)。如果将指针指定为特定内存空间的目标,则可以删除8位说明符,并且您有一个16位指针。因此,即使给定特定的体系结构和编译器,指针也可能有不同的大小。它们不同,但据我所知,它们总是容纳在大小为2^n位的cpu寄存器中;e、 g.68000有24位空间地址,但a0-a7寄存器是32位宽的寄存器。。。没有地址的“专用24位专用”寄存器。但是如果我想把32位的值hhelld写入寄存器,我会用同样的方法把32位的值写入a0-a7/d0-d7寄存器。因此,毕竟指针总是可以被认为是整数,它“适合”到一个足够大的寄存器中来保存它们。如果16位足以寻址所有可能的内存,这意味着8051有16位的地址空间,不是吗?@ShinTakezou肯定存在具有24位地址寄存器的架构@真的吗?我一个也不认识。你能告诉我一个或多个吗?(我打算自己用谷歌搜索,但万一搜索失败,找到答案会很有趣,也很懒散!)——目前在维基百科上只找到eZ80,哇然而,我的演讲仍然适用,因为在该cpu上,libc实现会将%lu正确地视为24位无符号整数,它可以是一个地址,所以“指针不是整数,它们是特殊的东西”的问题不会出现;例如,使用近指针和远指针进行DOS。纯粹主义者(像我一样)会指出,C规范允许任何数量的位指针,7位机器在过去已经存在。这些天我给出的数字是典型的,但绝对不能保证。+1教我关于z修饰符