s
は、システムによって割り当てられているので、あなたのサイズを短くすることでrealloc
を実行することができます。
s = realloc(s, 11);
しかし、あなたは、あなたができないことを、残りの部分を解放せずに割り当てられたゾーンの開始を解放することはできません。 memmove
& realloc
を使用して、後でデータをシフトしてサイズを縮小します。
free
割り当てられていないポインタ、または割り当てられたポインタにオフセットを加えようとすると、未定義の動作が発生します。
あなたが行うことができます(あなた自身を示唆するように、しかし、との問題が:)固定):
char *c = strdup(s + 10);
free(s);
s = c;
ので、今s
ポイントを文字列の末尾に。
代替strdup
せずのみ(ヌル終端文字忘却の危険性)の標準機能を使用して:
char *c = malloc(strlen(s) - 10 + 1);
strcpy(c,s + 10);
free(s);
s = c;
及びIは、最初は約示唆しmemmove
溶液(遊離しかしオフセット/割り当てる回避します/サイズは計算するのが難しい):
int offset = 10;
int size = strlen(s) - offset;
memmove(s,s+offset,size);
s[size]='\0'; // null-terminate
s = realloc(s,size+1); // adjust size after null-termination
いいえ、あなたはreallocで終了できます。とにかく無料でどういう意味ですか? –
質問には関係ありませんが、[mallocの結果をキャストすべきではありません](http://stackoverflow.com/q/605845/3425536)。 – emlai
'while(s [i]!= '\ 0')'では、割り当てられたメモリに含まれるものを前提としています。あなたが特に 's [20] = '\ 0';で設定したバイトまでは' 0 'になります。 *未定義の動作*があります。 –