首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >直接寻址数组内存

直接寻址数组内存
EN

Stack Overflow用户
提问于 2014-12-30 03:45:41
回答 5查看 105关注 0票数 1

我目前正在尝试学习如何以各种方式在内存中写入内容,即我正在玩。

我已经创建了一个结构,如下:

代码语言:javascript
运行
复制
struct strProjectile
{
    int Damage;
    int ParticlesPerSecond;
    short Fire;
    short Plasma;
};

然后,我创建了一个数组,如下所示:

代码语言:javascript
运行
复制
strProjectile Projectiles[40];

然后,我从该数组创建了一个指针,指向数组的开头:

代码语言:javascript
运行
复制
strProjectile *ptrProjectiles;
ptrProjectiles = Projectiles;

使用该指针,您可以像这样设置变量中的值(我知道这可以直接完成,而不是使用指针。符号):

代码语言:javascript
运行
复制
ptrProjectiles->Damage = 0;
ptrProjectiles->ParticlesPerSecond = 0;
ptrProjectiles->Fire = 0;
ptrProjectiles->Plasma = 0;

我还发现可以通过在数组的每个结构中创建一个指向每个变量的指针来设置变量中的值。例如,以下代码会将Damage设置为0:

代码语言:javascript
运行
复制
int *Damage = (int *)ptrProjectiles;
*Damage = 0;

我的问题是,我是否可以使用指向数组的指针直接在内存中设置结构中的每个变量,就像我在上面使用单独的指针进行破坏一样?使用像这样的东西:

代码语言:javascript
运行
复制
*ptryProjectiles = 0;

然后跳过4个字节的内存以获取结构中的下一个变量(在本例中为ParticlesPerSecond),设置该变量,然后再跳过4个字节并设置下一个变量(在本例中为Fire),然后跳过下2个字节并设置下一个变量(在本例中为to ),然后再跳过2个字节以获取数组中的下一个对象,然后重复...

我看不出我需要这样做的原因,但我只是想知道是否可以这样做,以帮助我完全理解……

提前感谢!

EN

回答 5

Stack Overflow用户

发布于 2014-12-30 03:50:16

通常,直接通过数组对结构数组进行寻址,如下所示:

strProjectiles2.Damage=0;

如果需要单个元素,请执行以下操作:

代码语言:javascript
运行
复制
Projectile * p= &strProjectiles[3];
p->Damage=0;
(*p).Fire=1;
票数 1
EN

Stack Overflow用户

发布于 2014-12-30 03:58:21

在下面的语句中,您假设int Damage;始终是第一个字段:

代码语言:javascript
运行
复制
int *Damage = (int *)ptrProjectiles;

这很容易出现将来的bug,不应该使用。如果只想在每个结构中设置int Damage;字段,可以使用use a loop:

代码语言:javascript
运行
复制
strProjectile Projectiles[MAX_PROJECTILES];
strProjectile *ptrProjectiles = Projectiles;

for(i = 0; i < MAX_PROJECTILES; i++)
    (ptrProjectiles + i)->Damage = 0;

更新

计算每个结构的第一个字段的地址是可能的,尽管很危险,如下所示:

代码语言:javascript
运行
复制
int *pDamage = (int *)Projectiles;

for(i = 0; i < MAX_PROJECTILES; i++)
{
    *pDamage = 0;
    pDamage = (void *)pDamage + sizeof(Projectiles[0]);
}
票数 0
EN

Stack Overflow用户

发布于 2014-12-30 04:02:01

TLDR:是的,但你可能不应该这样做。

你完全可以在C语言中做到这一点,你甚至可以接受一个字节流,并将其类型转换为你的结构,然后立即填充所有的数据成员。

其中的细微差别是它不是可维护的代码,所以...可能不是个好主意。另一点需要注意的是,一旦你完成了这种类型的变量访问/设置,你就与你的数据结构结婚了。如果不重新编写所有的代码,你就不能真正地改变它,移动变量,添加额外的数据成员或其他任何东西。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27695016

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档