1

ここにコードがあります

    int main
    {
    char s[]="prady";
    char **p;

    p=(char **)&s;

    printf("%u %u\n",p,*p);
    printf("%u %u\n",&s,s); 

    printf("%s\n",s);
    printf("%s\n",&s);
    printf("%u %u\n",s+1,&s+1);


    printf("%s\n",p);
    printf("%s\n",*p);
    }

o/p:

3217062327 1684107888
3217062327 3217062327
prady
prady
3217062328 3217062336
prady
Segmentation fault

私の疑問は次のとおりです

  1. s と &s の両方のアドレスが同じなのはなぜですか?

  2. 両方が同じである場合、1 を追加するとどのように異なることが示されますか?

  3. *p でどのようにセグメンテーション違反が発生しましたか?

4

3 に答える 3

2

まず、配列はポインターではありません。ポインターは配列ではありません。配列はポインターに崩壊します。

1.How both the address is same of s and &s?

char s[]="prady";

   --------------------------
s: | p | r | a | d | y | \0 |
   --------------------------

配列sは、6 文字を確保するための要求です。つまり、s文字数は 6 です。's` は「もの」であり、何も指していません。

char *ptr = "prady";

------         --------------------------
|*ptr|    -->  | p | r | a | d | y | \0 |
------         --------------------------

ポインターptrは、ポインターを保持する場所を要求します。ポインターは、任意の char または任意の文字列リテラル (連続した文字) を指すことができます。

これについて考える別の方法:

int b;   //this is integer type 
&b;      //this is the address of the int b, right?  

int c[]; //this is the array of ints 
&c;      //this would be the address of the array, right? 

したがって、これについてはかなり理解できます。

*c;   //that's the first element in the array 

そのコード行は何を教えてくれますか? c を参照すると、int が得られます。つまり、単純な c はアドレスです。これは配列の先頭であるため、配列のアドレスです。したがって、次のようになります。

c == &c;

2. If both are same then how they show different when adding 1 to it.

#1への私の答えから、なぜそれらが同じではないのかがわかると思います。では、なぜ異なる値が得られるのでしょうか。得られた値を見てください。

s    = 0x3217062327 
s+1  = 0x3217062328  // It's 1 bigger, why? Because a char takes 1 byte, s holds chars
                     // so s (address of a char) + 1 (sizeof char) gives you one more than s
&a + 1 //This is adding 1 (sizeof array) which is bigger than the size of a char  

3. How I got segmentation fault in *p.

これは、前の2つの回答から得られると思います...しかし:

  1. p は文字へのポインタへのポインタです
  2. p を配列のアドレスに設定します (覚えているのは配列自体です)。
  3. p の参照は char (別のアドレス) へのポインタですが、配列に対してはできません。

型キャストすると、コンパイラに「私はあなたよりもよく知っているので、これら2つを機能させるだけです」と伝えます。あなたがセグメンテーション違反をしたとき...それはあなたが本当によく知らなかったからです。

于 2012-09-28T21:58:36.480 に答える
1

1.s と &s の両方のアドレスが同じである方法。

s文字の配列です。ただし、配列はポインターに変換されますが、いくつかの場合を除きます。配列を初期化するために使用される場合 (たとえば、char s[]="prady"; 行)、単項演算子のオペランドで&ある場合 (コードの多くの場合)、およびそれらが演算子のオペランドですsizeof

2. 両方が同じ場合、1 を追加したときにどのように表示されるかが異なります。

それらは同じではありません。

2. *p でセグメンテーション違反が発生した方法。

pのアドレスが含まれています"prady"*pが含まれています"prady"。文字列のアドレスであるかのように使用しようとする"prady"と、segfault が発生します。

于 2012-09-28T21:38:15.380 に答える
1

あなたの場合、 s はポインターではありません。配列です!

小さな変更で問題が解決します。

char *s = "prady";
于 2012-09-28T21:18:03.353 に答える