Давайте начнем с предупреждения. Вы заявили:
char* cPTest[]
на английском языке: "cPTest
- массив указателей на символ "
и
char* makePointerCopy(char cIn[]);
на английском языке: "makePointerCopy()
принимает массив символов и возвращает указатель на символ "
Итак, вы пытаетесь присвоить " указатель на символ " на " массив указателей на символы ". Вы видите проблему? Я бы посоветовал тщательно проверить типы перед выполнением заданий.
Тем не менее, вы действительно хотите объявить makePointerCopy()
, чтобы вернуть «указатель на указатель на символ»:
char **makePointerCopy(char cIn[]);
потому что в конце вы вернете указатель на первый элемент возвращаемого массива.
Еще один важный момент: вы объявили «cOut» в качестве локальной переменной для функции.
char* makePointerCopy(char cIn[]) {
char* cOut[sizeof(cIn)/sizeof(cIn[0])];
... /* cOut can ONLY be used within the function! */
return cOut; // <-- The address returned point to a
// block of memory that is no longer valid
// after the end of the function
}
Помните, что локальные переменные автоматически становятся недействительными после завершения функции. Чтобы «сохранить» его, вы можете объявить его static
:
char* makePointerCopy(char cIn[]) {
static char* cOut[sizeof(cIn)/sizeof(cIn[0])];
... /* cOut will survive the end of the function */
return cOut; // <-- The address can be returned
}
Обратите внимание, что вы должны быть хорошо дисциплинированными при возврате значений такого типа.
В качестве альтернативы вы можете выделить необходимое пространство с помощью malloc()
, если вы будете помнить free()
, когда оно вам больше не нужно.