1
int ret(char *)
{
    //nothing    
}

int main(void)
{
   printf("%d\n",ret("foo"));
}

関数 ret がガベージ値を返すのはなぜですか ???

int my_strlen(char *s)
{
   if(*s)
      return 1 + my_strlen(s + 1); // or my_strlen(s+1) + 1;
}

上記の関数では、私が間違っていなければ、条件が失敗したとき (つまり、'\0' に達したとき) に my_strlen は常にジャンク値を返す必要があります。したがって、有効な文字列の場合、常に 1 + ジャンク値を返す必要があります。しかし、そうではありません。それは正常に動作します。任意の文字列の正確な長さを提供します。関数「 ret 」のようにジャンク値を返さないのはなぜですか??? 私の疑問を解消してください。どんな助けでも大歓迎です。ありがとう..

4

2 に答える 2

0

あなたの質問に対する一般的な敬意が欠けていて申し訳ありません。

本当の答えは、Eclipse/Microsoft C コンパイラでは、コードが「警告」付きでコンパイルされるということです。私はあなたのコードをコピーし、おそらくあなたのタイプミスを修正しました:

   // Here, I added the variable X
   int ret(char *X)
   {
       //nothing
   }

   int main(void)
   {
      printf("%d\n",ret("foo"));
   }

そして、次のメッセージを受け取りました:

   c:~\eclipsecdt\compilererrormsg\main.c(15) : warning C4716: 'ret' : must return a value

このメッセージが、コードを修正するために何をする必要があるかを説明していることを願っています。ガベージが発生する理由は、「スタック」と呼ばれるものと、ステートメントを発行していないreturn 0;(または必要に応じてゼロ以外の) ステートメントを発行していないため、整数がスタックに配置されていないためです。

お役に立てれば。

于 2013-08-03T06:01:12.307 に答える