Обращение к одномерному массиву указателей с двумя измерениями - PullRequest
3 голосов
/ 09 февраля 2010

У меня следующий домашний вопрос:

Consider the following declarations and answer the question.
char strarr1[10][32];
char *strarr2[10];

Are strarr1[3][4] and strarr2[3][4] both legal references?

Я попытался скомпилировать код с помощью gcc, чтобы протестировать его. Я был совершенно уверен, что вторая ссылка выдаст ошибку, но это не так. Вот что я скомпилировал с gcc:

int main(void){
    char strarr1[10][32];
    char *strarr2[10];

    char x = strarr1[3][4];
    char y = strarr2[3][4];

    return 0;
}

Я работаю в предположении, что использованный мной тестовый код верен.

Как можно ссылаться на strarr2 [3] [4], когда strarr2 является одномерным массивом?

Ответы [ 3 ]

1 голос
/ 09 февраля 2010

, поскольку strarr2 является массивом символов *, второй [4] является индексом в символе *

это означает то же самое, что и это

char * temp = strarr2[3];
char y = temp[4];

Так как я не вижу в вашем коде нигде, где инициализируется strarr2, и не вижу где-либо, где выделяется strarr2 [3], этот код не будет работать так, как он представлен. Он вернет либо мусор, либо сегмент.

1 голос
/ 09 февраля 2010

Они оба являются допустимым синтаксисом из-за соглашения об арифметическом индексировании указателей. Однако в вашем коде:

char y = strarr2[3][4];  // <--- NOT SAFE!

обращается к нераспределенной памяти и генерирует неопределенное поведение, поэтому плохо .

Так брось.

0 голосов
/ 09 февраля 2010

Это одномерный массив из указателей . Итак, вы индексируете указатель на 3 со смещением = 4:

char y = *(strarr2[3] + 4);

совпадает с:

char y = strarr2[3][4];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...