c - 为什么这个指针递增 0x10 而不是 0x04?
问题描述
在下面的代码中,写入内存时为什么会出现这行代码:
temp = ((int*) mem_allocate + i);
不增加连续 4 个字节的内存位置?由此产生的内存位置是:
0x20000818
0x20000828
0x20000848
...
等等。
我想将数据写入
0x20000818
0x2000081C
0x20000820
...
等等。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n = 1024;
int* mem_allocate;
int loop = 0;
int i = 0;
mem_allocate = (int*) malloc(n*sizeof(int));
for(i=0; i<40; i++)
{
int* temp;
temp = ((int*) mem_allocate + i);
i=i+3;
*temp =0xAAAAAAAAu;
*mem_allocate = *temp;
mem_allocate = temp;
if (i == 40)
{
loop = 1;
}
}
if (loop == 1)
{
free(mem_allocate);
}
return 0;
}
解决方案
您的循环控制变量i
在循环中加一for
:
for(i=0; i<40; i++)
然后再增加 3 个:
i=i+3;
所以i
在每次迭代中总体增加 4。指针算术说明了所指向对象的大小。在这里,您指向一个 32 位(4 字节)整数,并且每次递增 4,因此地址递增 4 x 4 = 16 字节。
你应该有:
for( i = 0; i < 10; i++ )
{
int* temp = mem_allocate + i ;
// i=i+3; REMOVE THIS!
...
请注意,演员阵容是不必要的;mem_allocate
已经int*
是表达式的类型mem_allocate + i
。
您的代码在其他方面存在缺陷,与您提出的问题无关 - 特别是不明智的修改mem_allocate
- 如果您修改它,任何释放它的尝试都将无效。
考虑:
#include <stdint.h>
#include <stdlib.h>
int main()
{
const int n = 1024;
uint32_t* mem_allocate = malloc( n * sizeof(*mem_allocate) ) ;
for( int i = 0; i < n; i++ )
{
mem_allocate[i] = 0xAAAAAAAAu;
}
free( mem_allocate ) ;
return 0 ;
}
正如你所看到的,你把一件简单的事情变得不必要地复杂了。
推荐阅读
- google-calendar-api - 删除事件时未找到 Google.Apis.Requests.RequestError
- c# - 使用 c# 在 EWS 中转发/回复邮件时如何更改主题
- python - 如何在vscode中运行几行选定的代码?
- android - 如何用数组更新表中的列
- css - 淘汰赛数据绑定中基于条件的类
- magento2 - 图片未上传。不允许的文件类型。在 magento 2
- c# - 方法 context.Orders.RemoveRange 引发 InvalidOperationException
- java - 为什么条目在 Firebase 数据库中不断循环?
- python - 模块在正确的文件夹中,但仍然说找不到
- java - 无法连接到 XAMPP 服务器