Как отрицательный индекс в этом 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"тогда это неправильно.

Другие вопросы по тегам