我正在阅读《黑客:剥削的艺术》一书,我正在努力理解以下代码:
int main(int argc, char *argv[]) {
int value = 5;
char buffer_one[8],buffer_two[8];
strcpy(buffer_one, "one"); /* Put "one" into buffer_one. */
strcpy(buffer_two, "two"); /* Put "two" intobuffer_two. */
printf("[BEFORE] buffer_two is at %p and contains\'%s\'\n", buffer_two, buffer_two);
printf("[BEFORE] buffer_one is at %p and contains \'%s\'\n", buffer_one, buffer_one);
printf("[BEFORE] value is at %p and is %d (0x%08x)\n", &value, value, value);
我无法理解的是,在前 2 个 printf 语句中,我们没有使用运算符地址,但输出给出了内存地址,对于整数,我们向 (&) 运算符提供了地址。我已经检查过 gdb,如果我使用 &buffer_two 和 &buffer_one,我会得到相同的结果,但是当我在最后一个 printf 语句中删除值之前的运算符地址时,我得到的输出是 0x5。
最佳答案
好了,你即将从新手迈入老手境界了。 :-)
当您定义一个数组时,例如 char buffer_one[8]
,名称 buffer_one
是代表数组地址的标签。该标签没有与之关联的地址,编译器选择实现 &buffer_one
以提供与没有 &
相同的结果。
对于非数组的值则不然,例如 value
。 value
保存一个值,&value
为您提供变量 value
的地址。
希望这能澄清问题。
顺便说一句,函数指针也是如此。我们都知道函数指针的使用方式如下:(*func_ptr)()
来调用它指向的函数,但它的工作方式也如下:func_ptr()
.
关于c - C 中缓冲区的运算符地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41793203/