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。
有谁知道我该如何解决这个问题?
谢谢你!
而不是使用var1 + sizeof(structA)
使用var1 + 1
指针算术的定义是指针的数值按对象类型的大小递增(或递减)。
因此, 的数值与+var1+1
的数值相同。var1
sizeof(*var1)
的数值与-var1-1
的数值相同。var1
sizeof(*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)