Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C语言中正确添加地址值_C - Fatal编程技术网

在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个字节,您需要一个在字节边界上工作

以下面的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个字节,您需要一个在字节边界上工作的数据类型,如
字符*
。现在你可能会认为你正在这么做(
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*
plus
something
,查看添加到初始地址的
something
,即
sizeof(int)*something
(标准指针算术)。

您的目标根本不清楚。请解释一个目标,并写一个实际问题。这就是我想要的。谢谢哦,这是为了说明堆栈溢出,所以我一直添加到缓冲区内存地址末尾的原因。@bhuhbuhdbus,如果您想要更简单的堆栈溢出,只需使用
char buffer[1];strcpy(buffer,“这个字符串太大了,无法进入该缓冲区”)
ret = (int *)(buffer1 + 12);