Какой тип является ссылкой на переменную массива? - PullRequest
1 голос
/ 09 февраля 2011

У меня есть следующий код:

/*
 * Pointer to a function that reads a codesegment
 */
typedef bool (*BRCS)(void *, uint32, uint64 *, uint64 *, const char **, const char **);
BRCS get_prog_id;

/*
 * 'get_prog_id' is loaded from a dynamic library
 */

uint64 start_o;
uint64 length_o;
char prog_id[256];
char err[256];

get_prog_id(NULL, 0, &start_o, &length_o, &prog_id, &err);

Когда я запускаю свой компилятор, я получаю следующие предупреждения:

passing argument 5 of get_prog_id from incompatible pointer type    
passing argument 6 of get_prog_id from incompatible pointer type    

Итак, я жалуюсь, что у меня нет char ** за последние два аргумента.

Я в замешательстве.Насколько я понимаю, переменная, представляющая массив TYPES, эквивалентна указателю на TYPE.Таким образом, применение оператора & даст вам указатель на указатель на TYPE.

Что мне здесь не хватает?

Ответы [ 2 ]

2 голосов
/ 09 февраля 2011

Здесь есть две проблемы:

(1)

Тип &prog_id это не char *, это char (*)[256]; то есть указатель на символ-массив-длины-256.

(2)

Даже если вы можете получить char ** (например, char *prog_id = malloc(256); &prog_id), char ** является не совместимым с const char ** по несколько неясным причинам. Лучшее объяснение, если, возможно, здесь: http://c -faq.com / ansi / constmismatch.html .

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

Типы указателей и массивов эквивалентны только до одного уровня.Всякий раз, когда в игру вступает другой уровень косвенности, они перестают быть одинаковыми.

Понять это проще всего, если подумать, как должна работать арифметика с указателями в таком случае.Рассмотрим следующие определения:

typedef char tenchars[10];
tenchars *x;

Теперь &(x[1]) (то есть x+1) должно означать «адрес x плюс 10 символов», верно?Но что, если я сделаю следующее:

char **y = (char **)x;

Что означает &(y[1]) сейчас и почему?

Иными словами: Массив указателей отличается от массивамассивов.Следовательно, указатель на указатель не совпадает с указателем на массив.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...