2016-12-14 3 views
-2
#include <stdio.h> 

void f(char**); 

int main() { 
    char *argv[] = { "ab", "cd", "ef", "gh", "ij", "kl" }; 

    f(argv); 
    return 0; 
} 



void f(char **p) { 
    char *t; 

    t = (p += sizeof(int))[-1]; 
    printf("%s\n", t); 
} 

これは私が持っているコードで、質問は出力を求めています。私はなぜ出力がghであるのだろうかと思っています。私は、sizeof(int)がcharの要素の数と等しく、これが "t"ステートメントに関して6から1を引いたものと仮定しました。私はsizeof(int)を印刷し、それは私に4を与えました。私はちょうどsizeof(int)が4でなく、なぜ6であるのかと混同しています。 ありがとうございます。 t = (p += sizeof(int))[-1];ためこのコードの出力はなぜghですか?

+3

'sizeof(int)はcharの要素の数と等しくなります。どうやってその結論に至ることができましたか? – John3136

+0

ねえ、「argc」は何のためにあるのだろうか!!!! – paddy

+0

私はそれが単なる文字列であれば "文字列"と言っていましたが、その文字列のサイズはバイト単位でしょうか?それから私はさらに探して、私は間違っているが、それは4バイトになりますcharのポインタのサイズを計算しているので4だろうか? – thrugs

答えて

1

説明:ポインタである

  1. psizeof(int)要素だけインクリメントされます。あなたのマシンでsizeof(int)4と思われます。
  2. pは、5番目の要素へのポインタであり、"ij"です。
  3. [-1]は、tに1つの要素でデクリメントされたpを割り当てます。 pが1だけデクリメントされると、"gh"へのポインターを指していることを意味します。ああ、角括弧のためにここで逆参照操作が行われています。
  4. 印刷t

ただ、第三のポイントを説明するために、次の行でfを交換し、確認することがあります。

void f(char **p) { 
    char **t; 

    t = (p += sizeof(int)) - 1; 
    printf("%s\n", *t); 
} 

HTH。

+1

私は、 '' [-1] 'が' t 'に1つの要素で減った 'p'を割り当てたいと思っているのではないかと思いますが、あなたが得ているのは、標準によると、" E1 [E2] (ISO/IEC 9899:2011 6.5.2.1/2)したがって、 'p [-1] ==(*(p-1) ) '、' p'が配列の最初の要素を指していない限り、 't'は実際には' p'の前のポインタによって参照される値を割り当てられます。 –

+0

@DavidBowling "' t '実際に' p 'の前のポインタによって参照される値が割り当てられています" - 賢明に言えば:) – babon

0

私ははsizeof(int型)が4である理由として、単に混乱していない6

その他は、すでにあなたに正しい答えを与えているので、私はちょうどあなたがからのギャップを埋める手助けしようとしていますあなたの仮定は約sizeof(int)です。

サイズは、C演算子(関数ではない)です。 LinuxまたはMacをご利用の場合、人オペレータが端末に表示されます。そのオペランドのサイズをバイト数で返します。ほとんどの演算子とは異なり、sizeofは変数またはタイプで動作します。 sizeof(int)と言うときは、データ型intにsizeofを適用します。当然のことながら、結果は常に同じです。なぜなら、Cではプログラム内のすべてintが同じサイズを持つからです。あなたのマシンでは、そのサイズは4です。

これをさらに進めると、変数の名前をsizeofに与えるのが便利に過ぎないことがわかります。コンパイラは名前を解決し、タイプを見つけ、そのタイプのサイズを取得します。

するchar * ARGV []

我々は、アレイ内にあるどのように多くの要素を見つけるために有効にお使いargvにsizeofは適用することができます。配列全体のサイズはバイト単位でsizeof(argv)です。各要素は、配列内のすべての要素が同じサイズを持つため、バイト数はsizeof(argv[0])です。要素数はsizeof(argv)/sizeof(argv[0])です。

enum { nargv = sizeof(argv)/sizeof(argv[0]) }; 

と言うこともできます。すべての情報はコンパイル時に利用できるためです。

関連する問題