-2
#include<stdio.h>

struct a
{
    void *ptr;
    unsigned long val;
};

void main()
{
    unsigned char errno;

    struct a *id;
    id = malloc(sizeof(*id));
    func2(id);
    printf("After changing %d\n", id->val);
}


void func2(struct a *id)
{
    unsigned char errno;
    func(id,&errno);
}

void func(struct a *id,void *ptr)
{   
    memset(id, 0, sizeof(*id));

    id->ptr = ptr;
    if (sizeof(id->val) >= sizeof(id->ptr))
    {   
        id->val = (unsigned long)id->ptr;
        return;
    }

}

メイン関数で id->val を印刷すると、 -1075050593 が印刷されます。しかし、無効なアドレスにアクセスしようとしています。説明してください。私はCプログラミングに非常に慣れていません。

4

2 に答える 2

1

通常、「無効なアドレスへのアクセス」とは何ですか? 2つの部分で構成されています。1、アクセス:読み取り/書き込み/実行が含まれます。2、無効なアドレス: カーネル空間と un-malloced ヒープは、ユーザー アプリケーションの無効なアドレスです。

この場合、アドレス (&errno) はスタックに属しているため、無効なアドレスではありません。また、このアドレスのコンテンツを読み取り/書き込み/実行しません。したがって、無効なアドレスにアクセスしていません。

ところで、printf() 呼び出しで「%d」プレースホルダーを使用すると、「id->val」は符号付き int 型として説明されます。これが負の値を取得した理由です。ポインタには「%p」を、unsigned int には「%u」を使用してください。

于 2012-07-12T14:50:41.057 に答える
0

次のステートメントは、無効なアドレスにアクセスしようとしているのではなく、アドレスを出力しているだけです。

printf("After changing %d\n", id->val);

idに誤って渡されているため、保持される値は不明func2()です。

コードに関するいくつかの問題(コメントですでに言及されているものもあります):

  • asidに渡すときに、のアドレスを誤って取得するfunc2()idstruct a*
  • の暗黙的な宣言memset()malloc()、欠落しているインクルード ディレクティブとして
  • func()との暗黙の宣言func2()
  • の戻り値の型main()int
于 2012-07-12T11:40:49.223 に答える