这是一个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'。我也在我的系统中运行代码并得到相同的答案。
答案 0 :(得分:3)
在您的系统中sizeof(int)
原来是4
。现在您已将4
添加到p
- 此后,在添加后,它指向数组末尾的一个。现在使用-1
使其指向数组的最后位置。然后你打印它就得到gh
。
"ab" "cd" "ef" "gh"
+----+----+----+----+---
| | | | |
+----+----+----+----+---
^ ^ ^
| | |
p p+3 p+4
按-1
编制索引意味着p+4-1
或p+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 );
}
});
,那么就是错误的。