首页 > 解决方案 > 为什么这个指针递增 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; 
}

标签: c

解决方案


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

正如你所看到的,你把一件简单的事情变得不必要地复杂了。


推荐阅读