私は、C 文字列 (char*) を操作するためのいくつかの基本的な関数を作成するために、malloc、realloc、および free をいじっています。文字列から最後の文字を消去するときに、この奇妙な問題が発生しました。私はそのようなプロトタイプで関数を書きました:
int string_erase_end (char ** dst, size_t size);
「dst」文字列を1文字短くすることになっています。これまでのところ、私はこのコードを思いつきました:
int string_erase_end (char ** dst, size_t size)
{
size_t s = strlen(*dst) - size;
char * tmp = NULL;
if (s < 0) return (-1);
if (size == 0) return 0;
tmp = (char*)malloc(s);
if (tmp == NULL) return (-1);
strncpy(tmp,*dst,s);
free(*dst);
*dst = (char*)malloc(s+1);
if (*dst == NULL) return (-1);
strncpy(*dst,tmp,s);
*dst[s] = '\0';
free(tmp);
return 0;
}
main() で、文字列を切り詰めると (以前に malloc を呼び出しました)、奇妙な結果が得られます。切り捨てたい文字数に応じて、正常に機能するか、間違った数の文字が切り捨てられるか、セグメンテーション違反がスローされます。
私は動的メモリ割り当ての経験がなく、常に C++ とその std::string を使用してそのような汚い作業をすべて行ってきましたが、今回は C でこれを行う必要があります。ここで間違い。前もって感謝します。