此 C 代码中的负索引如何产生给定的输出?

How is the negative index in this C code producing the given output?

这是一段C代码:

#include <stdio.h>
void fun(char**);

int main() {
  char*argv[] = {"ab","cd","ef","gh"};
  fun(argv);
  return 0;
}

void fun(char**p) {
  char* t;
  t = (p+=sizeof(int))[-1];  //negative index
  printf("%s\n",t);
}

我执行了这段代码并得到了 'gh' 的输出。我的理解是,当 int* t = &a 其中 a 是一个数组然后 t[-2] 将使 t 指向 *(t-2) 并且它应该是 t 的当前值之前的某个位置。但这里的输出是 t 当前位置的下一个值。有人可以解释为什么会这样吗?

p+=sizeof(int) 应该使 p 指向 argv[2]。那么'gh'是怎么输出的呢

EDIT 鉴于 int 的大小为 2 个字节。这是一个模拟测试系列的问题。他们给出的答案是'gh'。我也 运行 我系统中的代码并得到了相同的答案。

在您的系统中 sizeof(int) 结果是 4。现在您将 4 添加到 p - 此时添加后它指向数组末尾的一个。现在您使用 -1 使其指向数组的最后一个位置。然后你打印它,你会得到 gh.

 "ab" "cd" "ef" "gh"
+----+----+----+----+---
|    |    |    |    |
+----+----+----+----+---
  ^              ^     ^        
  |              |     |
  p             p+3    p+4

-1 的索引表示 p+4-1p+3

在执行此操作之前,您还应该检查 sizeof(int) 的值。如果 sizeof(int) 结果不同,那么结果会有所不同,甚至可能导致未定义的行为。 (如果在某些系统上 sizeof(int)=8)。

如果 sizeof(int)=2,那么无论你在问题最后说什么都是有效的,但是 p+=sizeof(int) 也不是很常见的方法。


如果sizeof(int)=2那么它会给出"cd"作为答案。如果给出的答案不是 "cd",则 是错误的