"Попередження: призначення з несумісного типу вказівника" при використанні подвійного покажчика

У мене є питання про попередження "призначення від несумісного типу вказівника". Чому наступний код

const char files[][128]={"file1","file2","file3"};
char **ptr;

ptr=files;

виробляти це попередження? Щось більш складне працює просто чудово:

typedef struct
{
double **matrix;
}foo_struct;

void fun(foo_struct *foo)
{
double **ptr;
ptr=(*foo).matrix;
}

Тому я не можу зрозуміти, чому перше дає це попередження, тому що я думав, що щось на зразок файлів [] [128] має такий же тип, як char ** ptr. Єдина різниця, яку я бачу в тому, що C знає про пропуск/розмір дійсної області пам'яті, тоді як у другому прикладі це не так.

Here's something similar, which didn't help me though: Warning about assignment from incompatible pointer type when using pointers and arrays?

Дякую за твою допомогу!

0
Було запитано багато разів. Можливі дублікати Чи є масив 2d подвійним покажчиком?
додано Автор AnT, джерело
Було запитано багато разів. Можливі дублікати Чи є масив 2d подвійним покажчиком?
додано Автор AnT, джерело
Було запитано багато разів. Можливі дублікати Чи є масив 2d подвійним покажчиком?
додано Автор AnT, джерело

6 Відповіді

Це пов'язано з тим, що

const char files[][128]={"file1","file2","file3"};

робить files типу const char [] [128] , що еквівалентно типу const char (*) [128] .

У цьому сценарії ваші дані викладені в блоках по 128 символів на рядок. Вилучення файлів знаходить вас блок з 128 символів.

На противагу char ** очікує знайти масив директиви char * у символі при вилученні. Якщо ви хочете, щоб files було сумісним з char ** , ви повинні оголосити його як

const char * files[]={"file1","file2","file3"};
2
додано
Заявляючи це, воно дає точно таке ж попередження
додано Автор dimitris93, джерело

Це пов'язано з тим, що

const char files[][128]={"file1","file2","file3"};

робить files типу const char [] [128] , що еквівалентно типу const char (*) [128] .

У цьому сценарії ваші дані викладені в блоках по 128 символів на рядок. Вилучення файлів знаходить вас блок з 128 символів.

На противагу char ** очікує знайти масив директиви char * у символі при вилученні. Якщо ви хочете, щоб files було сумісним з char ** , ви повинні оголосити його як

const char * files[]={"file1","file2","file3"};
2
додано
Заявляючи це, воно дає точно таке ж попередження
додано Автор dimitris93, джерело

Це пов'язано з тим, що

const char files[][128]={"file1","file2","file3"};

робить files типу const char [] [128] , що еквівалентно типу const char (*) [128] .

У цьому сценарії ваші дані викладені в блоках по 128 символів на рядок. Вилучення файлів знаходить вас блок з 128 символів.

На противагу char ** очікує знайти масив директиви char * у символі при вилученні. Якщо ви хочете, щоб files було сумісним з char ** , ви повинні оголосити його як

const char * files[]={"file1","file2","file3"};
2
додано
Заявляючи це, воно дає точно таке ж попередження
додано Автор dimitris93, джерело

files has type char (*)[128], not char**; there is no second level of pointer (and we're not talking about const yet; it's another can of worms).

Цей код не повинен відображати попередження (за винятком константи)

const char files[][128]={"file1","file2","file3"};
char (*ptr)[128];

ptr=files;
1
додано

files has type char (*)[128], not char**; there is no second level of pointer (and we're not talking about const yet; it's another can of worms).

Цей код не повинен відображати попередження (за винятком константи)

const char files[][128]={"file1","file2","file3"};
char (*ptr)[128];

ptr=files;
1
додано

files has type char (*)[128], not char**; there is no second level of pointer (and we're not talking about const yet; it's another can of worms).

Цей код не повинен відображати попередження (за винятком константи)

const char files[][128]={"file1","file2","file3"};
char (*ptr)[128];

ptr=files;
1
додано