2017-03-09 14 views
-1

私はこのようなバッファを作成しますが、私はそれに内容を与えません。次に、このブロックメモリのstrlen()を表示しようとします。私は何を得る割り当てられたポインタのStrlen()

int size = 24; 
    char *c; 
    c = (char *)malloc(size); 
    printf("%d\n", strlen(c)); 

は私がC [47]に[40] Cからの値を表示しようと、私は常に\ 0を取得しますが、Cの後に[47]はもはやnullではない24が、40ではありません。 サイズ= 18に設定すると、結果は40になりません。それは32です。そして、c [32]からc [47]までの値はすべて\ 0です。 サイズを7に設定すると、結果は24になり、c [24]〜c [47]の値はすべて\ 0になります。
私はmalloc()関数で使用したサイズを私に与えることができないような配列のためにstrlenを使うことを知っています。 私はちょうどこれがなぜ起こったのか、サイズの値を変更したとき、結果がどのように変化するのでしょうか?これを使って対処できるものはありますか?
編集:誰もが結果が予測できないと思うようです。それは常に8の倍数であり、サイズを大きくすると結果が大きくなるという限界があります。結果の変更を行うサイズの値を正確に判断でき、何回テストしても変化しません。それはOSだけでなく、C言語やコンパイラに依存していますか?なぜ8が選ばれるのですか?

+3

未定義の動作、end of、case closed !! –

+0

サイドノート:[mallocの結果をキャストしない](http://stackoverflow.com/q/605845/1233251) –

答えて

2

文字列の長さは、strlen()のドキュメントをお読みください。多くの詳細がなければ、私はそう、あなたの唯一のオプションは、それを保存し、後でそれを使用することで、あなたに一つのこと、

動的にポインタの長さを取得する方法はありませんが教えてくれます。

シンプルでエレガントな方法は、あなたのサイズを格納しているためstructを使用し、それをあなたが必要とするすべての時間を使用することです。 "私は何を得るがない24、40ある" 質問、

あなたのポインタについては

struct pointer_type { 
    void *pointer; 
    size_t allocated_size; 
}; 

、初期化されていません。これは、指定された文字は、

int strlen(const char *const str) 
{ 
    int count = 0; 
    while (*(str++) != '\0') ++count; 
    return count; 
} 

のようなものを発生し、ランダムなゴミにあなたのポインタがあるため、これは正しく動作しなくなるまでの方法strlen()作品は、ポインタを逆参照し、文字をカウントすることであるため、未定義の動作として知られている原因戻り値は予測できません。

+0

あなたの答えをありがとう。私はstrlen()関数について知っており、サイズを取得したくありません。実際には、本当の問題はポインタからポインタ+ xまでのバイトの値が、特にnull値が最初に現れる場所のようにどのように設定されるかです。 –

+0

**すべてのテストは**未定の動作**のため信頼できませんので、何も予測することはできません。 –

2

割り当てたメモリは初期化されていません。 strlenに渡すと、NULで終了する文字列を期待する関数は未定義の動作をします。だから何でも得ることができ、結果を得る必要はありません。

割り当てられたメモリブロックの正確なサイズを知るためのC言語の組み込み方法はありません。

関連する問題