Вы на самом деле не сказали, что означает "работает", но я предполагаю, что вы запутались, почему dest
не изменяется на новую память в вызывающей функции.
Причина в том, что в вашей функции mystringcopy
параметр dest
является копией указателя dest
в вызывающей функции.
Затем вы назначаете эту копию новому буферу, делаете копию, и затем копия уходит. Оригинал без изменений. Вам нужно передать dest
как указатель (на указатель).
Кроме того, я предполагаю, что вы написали то, что сделали из памяти, поскольку она не должна компилироваться как есть (плохая разыменование в вызывающей функции). Вот фиксированный код:
char *src, *dest;
src = (char *)malloc(BUFFSIZE); // no dereference on src, it's a pointer
//Do something to fill the src
mystringcpy(src, strlen(src), &dest); // pass the address of dest
// take a pointer to a char*
void mystringcopy(char *src, size_t length, char **dest) {
// now you should dereference dest, to assign to
// the char* that was passed in
*dest = (char *)malloc(length + 1);
// for simplicity, make an auxiliary dest
char* destAux = *dest;
// and now the code is the same
for(; (*destAux = *src) != '\0'; ++src, ++destAux);
}
Другой метод - вернуть указатель dest
:
char *src, *dest;
src = (char *)malloc(BUFFSIZE);
//Do something to fill the src
dest = mystringcpy(src, strlen(src)); // assign dest
char* mystringcopy(char *src, size_t length) {
char* dest = (char *)malloc(length + 1);
// for simplicity, make an auxiliary dest
char* destAux = dest;
for(; (*destAux = *src) != '\0'; ++src, ++destAux);
return dest; // give it back
}
Имейте в виду, что если длина меньше реальной длины исходного буфера, вы переполните целевой буфер. См. Комментарии для решения, хотя это остается за вами.