我正在用C (32位)编写一个程序,输出一个字符串(15到40个字符长)。我选择使用指针和calloc来代替正式的数组声明。我的程序功能非常好,所以这不是一个关于逻辑或函数的问题,我只是好奇我的C代码的“引擎盖下面”发生了什么。
My的理解:当我使用calloc时,我是以字节为单位分配一段内存。变量存储在32位(或4字节)的内存位置中。在我的程序中,我使用指针(即*ptr =‘!’)编写字符,然后增加点(ptr++;)以移动到下一个内存位置。
我的问题是:,如果内存位置是32位,而我只写8位到那个内存位置,那么剩下的24位是否未使用?如果没有,则是我使用的指向8位子内存位置的指针,指向内存位置的8位段。
发布于 2017-02-22 09:28:11
寄存器的使用--技术上,甚至寄存器的存在--是C实现和它运行的硬件的一个特点。因此,在一般性层面上,你的问题没有明确的答案。在大多数情况下,关于“引擎盖下发生了什么”的问题都是正确的。
不过,就商品硬件的典型实现而言,
:当我使用calloc时,我是以字节为单位分配内存的一部分。
合理的描述。
变量存储在32位(或4字节)的寄存器中。
不是的。值存储在寄存器中。实现通常为常规内存中的变量值提供存储,尽管这些值可能被复制到寄存器中进行计算。
在某些特定于实现的情况下,某些变量可能没有关联的内存位置,它们的值只在寄存器中维护。但是,一般说来,变量或分配的空间从来都不是这种情况,也就是说,曾经,或者任何时候都可以被指针引用。
在我的程序中,我使用指针(即*ptr =‘!’)编写字符,然后增加点数(ptr++;)以移动到下一个寄存器。
不,绝对不是。增加指针会使指针指向动态存储的下一个元素,以指向类型的大小为单位。这与寄存器无关。写入指向对象可能涉及寄存器的使用(因为这是CPU的工作方式),但最终写到的字符最终会出现在常规内存中。
我的问题:如果寄存器是32位,而我只为该寄存器写8位,那么剩下的24位是否未使用?
正如我已经解释过的,这个问题是基于一个误解。写入的目标不是寄存器。在任何情况下,您正在编写的元素之间没有内存缺口。
可以想象,在某些情况下,聪明的编译器可能会通过在寄存器中收集字节并以相同大小的块执行写入,从而优化代码以最小化对内存的写入。它是否能够这样做或是否会这样做,取决于执行情况和有效的备选办法。
如果不是,那么我使用的指针是否指向8位子寄存器分配,指向寄存器的8位部分?
您的指针(逻辑上)指向主存,主存(逻辑上)可以以字节大小的单位寻址。它们没有指向寄存器。
发布于 2017-02-22 08:58:06
这些指针不一定要存储在寄存器中,通常它们只是存储在堆栈上。这是编译器优化的结果。在某些编译器中,您可以使用register
语句来确保寄存器的使用。
另外,没有“下一步”寄存器,寄存器没有地址。寄存器文件是与cpu集成的一种特殊的硬件单元,通常由一组特定的位来命名。
我建议您使用编译器或反汇编工具来查看它在程序集中的确切外观。
发布于 2017-02-22 08:58:32
不,没有注册,一般来说,它们是稀缺的资源。
实际上,您正在将返回指针指向的内存位置中的值写入其中。指针和指针算法考虑数据类型,因此返回的指针被转换为正确的类型,负责访问。
我使用指针(即
*ptr = '!';
)编写字符,然后增加点数(ptr++;
__)以移动到下一个寄存器。
不完全是,您正在讨论指针ptr
所指向的内存位置。在将ptr
定义为char *
的情况下,ptr++
与ptr = ptr + 1
相同,后者通过指向数据类型char
的大小来增加ptr
。因此,在表达式之后,ptr
指向内存位置中的下一个元素。
https://stackoverflow.com/questions/42397687
复制