2017-02-23 1 views
0

文字列を特定のポイントまで解放するにはどうすればよいですか?C:割り当てられた文字列の最初のセクションを解放するには?

char *s = (char *)malloc(sizeof(char) * 21); 
s[20] = '\0'; 
int i = 0; 
while (i < 21) 
{ 
    s[i] = i + 'a'; 
    i++; 
} 

をそして私はいくつかの点で文字列を切り取り、その半分格納します:たとえば、私が持っている場合

*(s + 10) = '\0'; 
char *m = s + 11; 

s + 10または最初\0までsを解放する方法はありますか?

+2

いいえ、あなたはreallocで終了できます。とにかく無料でどういう意味ですか? –

+1

質問には関係ありませんが、[mallocの結果をキャストすべきではありません](http://stackoverflow.com/q/605845/3425536)。 – emlai

+2

'while(s [i]!= '\ 0')'では、割り当てられたメモリに含まれるものを前提としています。あなたが特に 's [20] = '\ 0';で設定したバイトまでは' 0 'になります。 *未定義の動作*があります。 –

答えて

4

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 
+0

これはうまくいくのでしょうか? 'char * c = strdup(s + 10); free(&s); s = strdup(c); free(&c);「 –

+0

」は 'free'におそらく '&'をドロップします。あなたのコードを含めるために私の答えを編集します、それを解決します(それを受け入れたので:)) –

+1

@CosminSerdean 'char * c = strdup(s + 10);無料です。 s = c;はあなたが必要とするすべてです。 –

2

フリーダイヤルss + 10または最初の\0がありますか?

いいえ、少なくとも標準ライブラリにはありません。

reallocがありますが、「sからs + 10まで、または最初の\0」を解放することは保証されていません。

関連する問題