2015-11-29 3 views
1

Я не понимаю, почему следующий код:копия строки на символ **

char** receive_message(char** ret) 
{ 
    char* temp = "text"; 

    strcpy(&ret, temp); 
    return ret; 
} 

дает эту ошибку:

warning: passing argument 1 of ‘strcpy’ from incompatible pointer type [enabled by default] 
    strcpy(&ret, temp); 

Я пытаюсь скопировать сообщение, которое генерируется внутри функции к массиву char *, который выделяется вне функции.

+0

Почему вы проходите и возвращаете 'char **'? – fuz

+0

Вы вводите в заблуждение '& ret' и' * ret'. Но почему ret 'char **', и почему вы его возвращаете? – Roddy

+0

Мне нужна функция, которая получает сообщение с msgget как строку. – Mari

ответ

2

Использование

strcpy(*ret, temp); 

Вместо

strcpy(&ret, temp); 

Вы должны почтительное символ ** вместо того, чтобы ссылка на него.

1

Он хочет что-то типа char *, тогда как & ret имеет тип char ***.

Возможно, вы можете передать его * ret, который имеет тип char *.

0

ret является char** но strcpy ожидает char*

Вы возьмите адрес &ret, что делает его char***

Либо пройти ret как char* в receive_message или разыменования него при прохождении его strcpy (*ret, temp)

0

Вы передаете strcpy адрес указателя на стрелочный указатель char ... Это 2 уровня косвенности слишком много. Вам не нужны все эти indirections, вы можете упростить receive_message таким образом:

char *receive_message(char *ret) { 
    return strcpy(ret, "text"); 
} 

Не действительно стоит отдельная функция ;-)

Полезно передать адрес указателя на receive_function это вы собираетесь для этой функции изменить указатель в области вызова, как это было бы необходимо, если вам нужно перераспределить буфер, но поскольку вы не пройдете размер, такое перераспределение будет опасным.

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