C语言中的指针加减运算错误

1 c pointers pointer-arithmetic

现在我有一个像这样的指针算术代码

var1 + sizeof(structA)
Run Code Online (Sandbox Code Playgroud)

Var1是一个指针,structA是一个sizeOf 4字节的结构体。问题是,当我这样做时,地址向下移动 16 个字节而不是 4 个字节。我发现问题是因为在 C 中,即使我输入它实际上是

var1 + sizeof(structA) * sizeof(int)
Run Code Online (Sandbox Code Playgroud)

因为 int 是 sizeof 的返回值。有什么办法可以解决这个问题吗?对于类似的问题,我正在做

var1 - sizeof(structA)
Run Code Online (Sandbox Code Playgroud)

但它不是上移 16 个字节,而是上移 32 个字节,因此 0x10000032 变为 0x10000000。

有谁知道我该如何解决这个问题?

谢谢你!

R S*_*ahu 6

而不是使用var1 + sizeof(structA)使用var1 + 1

指针算术的定义是指针的数值按对象类型的大小递增(或递减)。

因此, 的数值与+var1+1的数值相同。var1sizeof(*var1)

的数值与-var1-1的数值相同。var1sizeof(*var1)

示例程序

#include <stdio.h>

struct FiftyBytes
{
   char d[50];
};

struct FortyBytes
{
   char d[40];
};

void test1()
{
   struct FiftyBytes a[2];
   struct FiftyBytes* var1 = a;
   struct FiftyBytes* var2 = var1 + 1;
   printf("var1: %p, var2: %p\n", var1, var2);

   struct FiftyBytes* var3 = &a[1];
   struct FiftyBytes* var4 = var3 - 1;
   printf("var3: %p, var4: %p\n", var3, var4);
}

void test2()
{
   struct FortyBytes a[2];
   struct FortyBytes* var1 = a;
   struct FortyBytes* var2 = var1 + 1;
   printf("var1: %p, var2: %p\n", var1, var2);

   struct FortyBytes* var3 = &a[1];
   struct FortyBytes* var4 = var3 - 1;
   printf("var3: %p, var4: %p\n", var3, var4);
}

int main()
{
   test1();
   test2();
}
Run Code Online (Sandbox Code Playgroud)

输出

#include <stdio.h>

struct FiftyBytes
{
   char d[50];
};

struct FortyBytes
{
   char d[40];
};

void test1()
{
   struct FiftyBytes a[2];
   struct FiftyBytes* var1 = a;
   struct FiftyBytes* var2 = var1 + 1;
   printf("var1: %p, var2: %p\n", var1, var2);

   struct FiftyBytes* var3 = &a[1];
   struct FiftyBytes* var4 = var3 - 1;
   printf("var3: %p, var4: %p\n", var3, var4);
}

void test2()
{
   struct FortyBytes a[2];
   struct FortyBytes* var1 = a;
   struct FortyBytes* var2 = var1 + 1;
   printf("var1: %p, var2: %p\n", var1, var2);

   struct FortyBytes* var3 = &a[1];
   struct FortyBytes* var4 = var3 - 1;
   printf("var3: %p, var4: %p\n", var3, var4);
}

int main()
{
   test1();
   test2();
}
Run Code Online (Sandbox Code Playgroud)

如果您检查指针值的差异,您会注意到:

var1: 0x22ca50, var2: 0x22ca82
var3: 0x22ca82, var4: 0x22ca50
var1: 0x22ca70, var2: 0x22ca98
var3: 0x22ca98, var4: 0x22ca70
Run Code Online (Sandbox Code Playgroud)