在C语言中正确添加地址值
以下面的C代码为例:在C语言中正确添加地址值,c,C,以下面的C代码为例: char buffer1[5]; int* ret; printf("Buffer1 is: %x\n", (int*)buffer1); ret = (int*)buffer1 + 12; printf("Ret is: %x\n", ret); 我只想向buffer1添加12个字节并将其存储在ret中。这显然是错误的,但我不知道如何正确地在C中添加十六进制地址。非常感谢您的帮助。如果您想添加12个字节,您需要一个在字节边界上工作
char buffer1[5];
int* ret;
printf("Buffer1 is: %x\n", (int*)buffer1);
ret = (int*)buffer1 + 12;
printf("Ret is: %x\n", ret);
我只想向buffer1添加12个字节并将其存储在ret中。这显然是错误的,但我不知道如何正确地在C中添加十六进制地址。非常感谢您的帮助。如果您想添加12个字节,您需要一个在字节边界上工作的数据类型,如字符*
。现在你可能会认为你正在这么做(buffer1
衰减为char*
),但是,因为强制转换比加法绑定得更紧密,(int*)buffer1+12
实际上意味着((int*)buffer1)+12
,而不是(int*)(buffer1+12)
将12添加到int*
中的问题是,它会缩放加法。如果你的int
是四个字节,加上12实际上会增加48个字节
如果将分配行更改为:
ret = (int*)(buffer1 + 12);
您会发现添加发生在buffer1
上,因此不会被缩放,然后转换为int*
将对该值进行操作
当然,我应该提到,取消对结果指针的引用可能不是一个好主意,因为它将超出实际数组的边界
我还建议%p
可能是用于指针的更好格式字符串。应该是:
ret = (int*) (buffer1 + 12);
我们应该做到这一点。
int*
plussomething
,查看添加到初始地址的something
,即sizeof(int)*something
(标准指针算术)。您的目标根本不清楚。请解释一个目标,并写一个实际问题。这就是我想要的。谢谢哦,这是为了说明堆栈溢出,所以我一直添加到缓冲区内存地址末尾的原因。@bhuhbuhdbus,如果您想要更简单的堆栈溢出,只需使用char buffer[1];strcpy(buffer,“这个字符串太大了,无法进入该缓冲区”)代码>。
ret = (int *)(buffer1 + 12);