2011-02-09 8 views
1

У меня есть следующий код:Какой тип является ссылкой на переменную массива?

/* 
* 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.

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

+0

Является ли это константой? –

+0

Разве это не вопрос постоянной корректности? Т.е. добавление const перед типом char заставляет его работать? –

ответ

2

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

(1)

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

(2)

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

+0

Yikes! Это какая-то эзотерическая штука. Thanks – Dancrumb

+0

Thanks; Я удалил синтаксис массива и заменил его явной точкой. Затем я накладываю '& prog_id' на' (const char **) '. Ссылка, которую вы указали, предположила, что приведение может указывать на другие проблемы, но я считаю, что проблема связана с определением библиотеки, поэтому я застрял над ней. – Dancrumb

+0

@ Dancrumb: определение библиотеки указывает на то, что она ожидает, что вы определите переменную как 'const char * prog_id'.(Обратите внимание, что это не означает, что 'prog_id' сам является' const' - только символы, на которые он указывает). – caf

1

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

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

typedef char tenchars[10]; 
tenchars *x; 

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

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

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

Поставить иначе: Массив указателей - это не то же самое, что массив массивов. Следовательно, указатель на указатель не совпадает с указателем на массив.

Смежные вопросы