2017-12-07 1 views
0

私はsimilar questionへの答えを赤色にしていますが、この問題は広範囲かつ厳密に議論されています。私は彼らに与えた正しい解釈を確実にしたいと思います。例えばタイプ、式、配列の次元

のsizeofオペレータがタイプまたは式を格納するのに必要なバイト数を見つけるために使用することができる」という。配列に適用すると、運動6.24で私のtextbook状態、、、それはありません配列のサイズを返します。 "

#include<stdio.h> 

void f(int *a); 

int main(){ 
    char s[] = "deep in the heart of texas"; 
    char *p = "deep in the heart of texas"; 
    int a[3]; 
    double d[5]; 

    printf("%s%d\n%s%d\n%s%d\n%s%d\n", 
     "sizeof(s) = ", sizeof(s), 
     "sizeof(p) = ", sizeof(p), 
     "sizeof(a) = ", sizeof(a), 
     "sizeof(d) = ", sizeof(d)); 

    f(a); 
    return 0; 
} 

void f(int *a){ 
    printf("In f(): sizeof(a) = %d\n", sizeof(a)); 
} 

それでも、それは私には明らかではありません。したがって、私は簡単にあなたと出力を議論したいと思います:

sizeof(s) = 27 
sizeof(p) = 8 
sizeof(a) = 12 
sizeof(d) = 40 
In f(): sizeof(a) = 8 
その後

:この場合

sizeof(s) = 27 

27している、各charで構成されていることsのバイト数で構成され1バイトのこれは配列の_size_のように見えるので、sizeofの定義とは対照的に現れます。この時点で、char s[] = "deep in the heart of texas"の式とみなされていると思っていますか?

sizeof(p) = 8 

ここでは、ポインタchar *があります。 sizeofは "型を格納するのに必要なバイト数を見つける"ので、ポインタchar *は8バイトのメモリに格納されていると仮定します。私は正しいですか?

sizeof(a) = 12 and In f(): sizeof(a) = 8 

この場合、私は特に不明です。私が見つけた唯一の相違点は、f()の配列aparameter:そのベースへのポインタとして渡されていることです。前述のように、ポインタは8バイトのメモリに格納されます。私は正しいですか?その場合、12は式int a[3]を格納するのに必要なメモリ量と見なす必要がありますか?

sizeof(d) = 40 

再び、8バイト毎の5つのセクションである配列dの寸法を返すように見えます。しかし、やはり配列のことではなく、式double d[5]を考えています。それが正しいか?

あなたの知識と経験を私に教えてくれてありがとう!私はここにすべての読み取りをしませんでしたが、テキストの

+0

私はあなたが提案した質問の重複として質問を考えなかった。なぜなら、彼らはそれほど多くの研究努力を示しておらず、表現について話をしていないということです。おそらく私は間違っています。この場合、私は次回はもっとうまくやりたいと思います。どんな提案も高く評価されます。 – Worice

+0

"配列に適用すると、配列のサイズは得られません" - 通常、配列の "サイズ"について誰かが語ったとき、配列内の要素の数を意味します。このことを理解した上で、その陳述は正しい。 'char'の配列では、配列のサイズが配列を格納するのに必要なバイト数である場合もありますが、他の型の場合はそうである必要はありません。 –

+0

@DavidBowlingそれは貴重なpunctualizationです、ありがとう! – Worice

答えて

2

簡単に言えば:

1)sizeof(s) = 27:NULターミネーターを含む文字列の長さ。 sizeof(char)は標準で1であることに注意してください。

2)sizeof(p) = 8:システム上のchar*のサイズ。

3)sizeof(a) = 12mainの場合は、配列の要素の数に各要素のサイズを掛けたものです。要素の数を乗じたsizeof(double):このことから、我々はsizeof(int)は4

4)sizeof(d) = 40であることを推測することができます。

関数fでは、渡された配列のポインタ型がで、になりました。おそらくsizeof(a)は8になるでしょう。標準はを主張していません。sizeof(char*)sizeof(int*)と同じですが、私は決してそうでないデスクトップPCに遭遇したことはありません。

+0

私は正しい解決策に向かっていたことを嬉しく思う。あなたの合成と直接的な答えをありがとう! – Worice

1

多くは、私の答えです:

char s[] = "deep in the heart of texas"; // sizeof = length of string + 1 
char *p = "deep in the heart of texas"; // sizeof is size of pointer = 8 
int a[3];         // size of 3 ints 
double d[5];        // size of 5 doubles 

とそのサイズがサイズですのでfに、あなたは正しく、ポインタを取得してそれを宣言ポインタ。

すべてです...

+0

あなたの簡潔な答えをありがとう! – Worice