Как отрицательный индекс в этом C-коде дает данные?
Вот код 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 байта. Это вопрос из серии пробных испытаний. Они дали ответ как "гх". Я тоже запустил код в моей системе и получил тот же ответ.
1 ответ
В вашей системе 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"
тогда это неправильно.