2016-09-08 4 views
0

У меня есть некоторые проблемы при понимании указателей на символы. Допустим, имеется следующее объявление методы (извините, но я не имею реализации методы, я надеюсь, что это достаточно, чтобы объяснить мою проблему):Функция C++ с параметром char **

short GetInfo(char **param1, char **param2); 

Я попытался назвать 2 различными способами:

// 1. When I call it this way it works 
char param1_val[20]; 
char *param1_ptr = param1_val; 

char param2_val[20]; 
char *param2_ptr = param2_val; 

GetInfo(&param1_ptr, &param2_ptr); 

// 2. When I call it that way I get an 'access violation exception' 
char *param1_array[20]; 
char *param2_array[20]; 

GetInfo(param1_array, param2_array); 

Я думал

char param1_val[20]; 
char *param1_ptr = param1_val; 

такая же, как

char *param1_array[20]; 

Но, похоже, они разные. Есть ли способ, как я мог бы получить свою вторую работу? Или я смешал вещи, и я должен сделать это, как в случае 1?

+1

Указатели - это боль, и указатели на указатели двойные так. Это очень самонадеянно. Тем не менее, вы должны знать, что такое массив, какой указатель и как они относятся. – MSalters

+0

@MSalters: Это определенный интерфейс, написанный кем-то, с кем я не могу больше спрашивать. Я знаю, что указатели - это боль, особенно для тех, кто очень новичок в C++. Вот почему я здесь, в SO. – onestarblack

ответ

3

Я думал

char param1_val[20];

char *param1_ptr = param1_val;

такая же, как

char *param1_array[20];

Они не то же самое.

char param1_val[20]; 
char *param1_ptr = param1_val; 

Объявляет массив из 20 символов param1_val и объявляет & назначает param1_ptr в ячейку памяти param1_val[0], поэтому &param1_val[0].

char *param1_array[20]; 

Объявляет массив из 20 символьных указателей param1_array, которые до сих пор указывают на места для мусора.

Я предполагаю, что GetInfo разыменовывает указатели в вашем param1_array и вызывает нарушение доступа, поскольку попытка чтения с произвольного адреса памяти не является чем-то, что вы хотите сделать.

2

Вероятной причиной для объявления GetInfo как функция принимая char** является то, что выходыchar*, так что, вероятно, как ожидается, будет использоваться больше как так:

//short GetInfo(char **param1, char **param2); 
char *ptr1=nullptr; 
char *ptr2=nullptr; 
GetInfo(&ptr1,&ptr2); 
if(ptr1)  
    std::cout<<*ptr1<<std::endl; 
//etc 

Чтобы действительно понять, указатели и массивы , найдите документацию C по этому вопросу. В C++ они обратно совместимы с C. Однако на C++ лучше работать на более высоком уровне, например. используйте STL вместо кодирования в стиле C.

+0

Спасибо за ссылку. Я посмотрю. Я согласен с вами, метод хочет вернуть символ 'char *'. Но если я инициализирую параметры с помощью «nullptr», они по-прежнему остаются нулевыми после вызова метода. – onestarblack

+1

Возможно, он не хочет выводить указатель в конце концов. Это может быть просто ненужная косвенность. –

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