gpt4 book ai didi

c - 为什么这个指针递增 0x10 而不是 0x04?

转载 作者:行者123 更新时间:2023-11-30 20:58:37 25 4
gpt4 key购买 nike

在下面的代码中,写入内存时为什么会出现这行代码:

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

最佳答案

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

正如您所看到的,您将一件简单的事情变得不必要地复杂化。

关于c - 为什么这个指针递增 0x10 而不是 0x04?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51443140/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com