【问题标题】:How is the negative index in this C code producing the given output? [closed]此 C 代码中的负索引如何产生给定的输出? [关闭]
【发布时间】:2018-06-16 19:36:56
【问题描述】:

这是一个 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 = &amp;a 其中 a 是一个数组,然后 t[-2] 将使 t 指向 *(t-2) 并且这应该是 t 当前值之前的某个位置。但这里的输出是 t 当前位置的下一个值。有人可以解释为什么会这样吗?

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

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

【问题讨论】:

  • 如今在大多数系统上,int 的大小是 4。现在在纸上画出数组,并在该数组中的索引4 上画一个箭头。该箭头是p += sizeof(int) 创建的指针。现在获取之前的索引(即索引-1)。
  • p+=sizeof(int),WTF
  • 也许你应该检查一下sizeof(int) 在你的系统上到底是什么。虽然 2可能,但不太可能。
  • Given that the size of int 2 bytes..好吧,那是真的。然而,在大多数现代系统中,sizeof(int) 的计算结果为 4
  • @SouravGhosh:我敢打赌 OP 正在使用 Turbo-C。

标签: c arrays pointers indices


【解决方案1】:

在您的系统中,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)=2p+=sizeof(int) 不是很常见的处理方式,您在问题末尾所说的任何内容都是有效的。


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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-29
    相关资源
    最近更新 更多