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

时间:2018-01-07 17:43:58

标签: c arrays pointers indices

这是一个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)应该指向argv[2]。然后'gh'是如何作为输出的。

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

1 个答案:

答案 0 :(得分:3)

在您的系统中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"作为答案。如果给出的答案不是 AFRAME.registerComponent('json-text-loader', { schema: {}, init: function () { var url = 'json/text.json'; var parentEL = this.el; var request = new XMLHttpRequest(); request.open( 'GET', url, true ); request.addEventListener( 'load', function ( event ) { var game = JSON.parse( event.target.response ) var keys = Object.keys(game); var random = game[keys.length * Math.random() << 0]; var trivia = random.Title var game2 = JSON.parse( event.target.response ) var keys2 = Object.keys(game); var random2 = game[keys.length * Math.random() << 0]; var trivia2 = random2.Title var textEntity = document.querySelector('#text'); var gurl = random.Imageurl var sceneEl = document.querySelector('a-scene'); sceneEl.querySelector('a-box').setAttribute('material', {src:gurl}); textEntity.setAttribute("visible", "false") let visibleRandom = Math.floor(Math.random() * 3); // THIS ELEMENT WILL BE VISIBLE let anwserRandom = Math.floor(Math.random() * 3); // THIS IS THE ELEMENT WITH THE CORRECT OPTION let children = Array.from(parentEL.children); children.forEach((el, index) => { if (index == visibleRandom) { el.setAttribute("visible", "true") el.setAttribute("value", trivia2) } else { el.setAttribute("visible", "false") } if (index == anwserRandom) { el.setAttribute("value", trivia) } el.addEventListener("click", (e) => { if(el.getAttribute("value") == trivia) { el.setAttribute("color", "green") } else { el.setAttribute("color", "red") } }); }); }); request.send( null ); } }); ,那么就是错误的