为什么此指针增加0x10而不是0x04?

时间:2018-07-20 13:00:59

标签: c

在下面的代码中,向内存写入时为什么执行以下代码行:

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; 
}

1 个答案:

答案 0 :(得分:1)

您的循环控制变量ifor循环中递增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 ; 
}

如您所见,您做了一件不必要的复杂事情。