-4
int main(void)
{
  int a=5;
  fun();
  printf("%d",a);
  return 0;
}

printf が15を出力するように、関数fun()の本体を記述する必要があります。fun()のプロトタイプを変更することはできません。つまり、何も渡すことができず、関数内のものを変更することはできませんmain()

4

4 に答える 4

5

警告 - 恐ろしいハッキングが発生しています:

void fun()
{
    int b;
    int *a = &b;
    while(*a != 5)
    {
        a++;
    }
    *a = 15;
}

これは、ローカルで宣言された int と同じアラインメントを持つことを前提として、変更したい変数に期待される値をスタックから検索します。また、変数が実際にスタック内にある (最適化によって除去される可能性がある) こと、および関連する数値を含む他の場所が見つからないことも想定しています。これらは、当然、危険な仮定です。仮定が間違っていることが判明した場合、悪いことが起こる可能性があります。私は、このようなハックの使用に起因する怪我、四肢の喪失、または死亡について責任を負いません。

代わりに、やや安全です:

void fun()
{
    printf("1");
}
于 2013-03-22T08:44:04.550 に答える
2

あなたの質問はタグ付けされただけ[c]です。またはが別様に定義されていない限り、あなたが求めていることは、正しい移植可能なCを使用して行うことはできません。afun()

この質問がスタックスマッシング攻撃に関するものである場合、次のものがなければ答えられません。

  • これが質問の内容であることを知っています。
  • ターゲット ハードウェア アーキテクチャと OS の完全な詳細を把握している。
于 2013-03-22T08:32:43.507 に答える
1

のプロトタイプを変更できない場合はfun()、マクロにします;-)

#define fun() (a = 15)

int main(void)
{
  int a=5;
  fun();
  printf("%d",a);
  return 0;
}
于 2013-03-22T08:29:35.197 に答える
0
#include <stdio.h>
void fun();

int main(void)
{
  int a=5;
  fun();
  printf("%d", a); 
  return 0;
}

void fun() {
  int p[1];
  p[11] = 15; 
  printf("%d\n", p[11]);
}
于 2013-03-22T08:44:44.657 に答える