「機能する」とはどういう意味かは実際には言っていませんが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
}
長さがソースバッファの実際の長さよりも短い場合は、デスティネーションバッファをオーバーランすることに注意してください。解決策についてはコメントを参照してください。ただし、これはあなたに任されています。