0

I am coming back from after reading this c-faq question I am totaly confused what happening here.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void main  ()
 {
   char ar[3]="NIS", *c;
   printf ("%s\n", ar);
   strcpy (c, ar);
   printf ("%s\n", c);
   if (ar[4] == '\0')
{
   printf ("Null");
 }
else 
  {
  printf ("%c\n", ar[4]);
  }
}

Here I have assigned "NIS" Equal size of declare array.and when i try to access ar[3],ar[4] it giving null why ? it's ok in case of ar[3] but why in case of ar[4] Another thought: In c-faq it was mentioned that if you assign any string equal to the size of declared array, you can't use printf ("%s"), and strcpy() on that array as it is mentioned in c-faq. But in my above code i have used printf as well as strcpy here both working fine.It might be i have interpreted wrong please correct me. and another question is that When I try to compare ar[5] with null it is not printing anything that's ok but why it is printing Null for ar[4].My thought on this "NIS" String will store in memory like this..

Thanks in advance.

  --------------------------------------------------------
  |   N   |   I    |   S   |   /0   |  Garbage value here
  |_______|________|_______|________|_____________________
    ar[0]    ar[1]   ar[2]    ar[3]  

Well Here ar[3] is giving null when I compare it with '\0' that's ok but when I comapre it with ar[4] still it giving me null instead of some garbage value..

4

3 に答える 3

5

あなたのコードは未定義の動作を示します。偶然うまくいきますが、別のマシンでは失敗する可能性があります。FAQ でご理解いただいた通り、コードが無効です。しかし、それは常に失敗するという意味ではありません。それは単に定義されていない動作の性質です。文字通り何でも起こりえます。

配列の末尾を超えているため、アクセスar[3]は不正です。この配列の有効なインデックスは、0、1、および 2 です。

メモリを割り当てていないcため、ポインターの逆参照は未定義の動作です。

あなたのmain宣言は間違っています。あなたは書くべきです:

int main(void)
于 2012-05-17T07:07:32.960 に答える
2

これをしないでください。宣言は、包括的にインデックスをchar NIS[3];使用できる 3 文字の配列を提供します。02

(逆参照のための) 他のインデックスの使用は未定義の動作であり、実行すべきではありません。

それが機能している理由は、「ガベージ」値がゼロ以外でなければならないことを示すものがないためです。それが、このコンテキストでのガベージの意味です。ガベージは何でもかまいません

ポインターが有用なものに初期化されていないstrcpyため、未定義の動作でもあります。c

于 2012-05-17T07:11:00.653 に答える
0

ar は 3 文字しかないため、ar[3] は存在しません。

そのよくある質問は、それは合法であると言っていますが、C 文字列ではありません。

配列が短すぎると、ヌル文字が切り捨てられます。

基本的に、「abc」は暗黙的に「a」、「b」、「c」、0 です。ただし、ar の長さは 4 ではなく 3 であるため、ヌル バイトは切り捨てられます。

この状況 (および OS) でコンパイラが何を選択するかは不明です。たまたまうまくいくとしたら、それはただの運です。

于 2012-05-17T07:05:25.847 に答える