Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 空间复杂性_C - Fatal编程技术网

C 空间复杂性

C 空间复杂性,c,C,如何获取运行时指针占用的空间想象一个类型,我将其称为“type”。可能是一个“int”,可能是一个奇特的结构 type *p; sizeof(p)=指向p的指针的大小(即,存储“p”中数据所在地址所需的字节数。在PC上,可能是4或8个字节,这取决于您是采用32位还是64位体系结构,但这不能保证。在其他体系结构上,它几乎可以是任何东西) sizeof(*p)=类型p的尺寸;用于在“类型”中存储数据的字节数 重要提示: 您可能会看到这样做的代码: p = malloc(sizeof(*p)+

如何获取运行时指针占用的空间想象一个类型,我将其称为“type”。可能是一个“int”,可能是一个奇特的结构

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修饰符