在下面的代码中,向内存写入时为什么执行以下代码行:
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;
}
答案 0 :(得分:1)
您的循环控制变量i
在for
循环中递增1:
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 ;
}
如您所见,您做了一件不必要的复杂事情。