此 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-1
或 p+3
。
在执行此操作之前,您还应该检查 sizeof(int)
的值。如果 sizeof(int)
结果不同,那么结果会有所不同,甚至可能导致未定义的行为。 (如果在某些系统上 sizeof(int)=8
)。
如果 sizeof(int)=2
,那么无论你在问题最后说什么都是有效的,但是 p+=sizeof(int)
也不是很常见的方法。
如果sizeof(int)=2
那么它会给出"cd"
作为答案。如果给出的答案不是 "cd"
,则 是错误的 。
这是一段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-1
或 p+3
。
在执行此操作之前,您还应该检查 sizeof(int)
的值。如果 sizeof(int)
结果不同,那么结果会有所不同,甚至可能导致未定义的行为。 (如果在某些系统上 sizeof(int)=8
)。
如果 sizeof(int)=2
,那么无论你在问题最后说什么都是有效的,但是 p+=sizeof(int)
也不是很常见的方法。
如果sizeof(int)=2
那么它会给出"cd"
作为答案。如果给出的答案不是 "cd"
,则 是错误的 。