77

K&R は詳しく説明しませんが、使用しています。サンプルプログラムを書いてどのように動作するかを試してみましたが、うまくいきませんでした:

#include <stdio.h> 
int bleh (int *); 

int main(){
    char c = '5'; 
    char *d = &c;

    bleh((int *)d); 
    return 0;  
}

int bleh(int *n){
    printf("%d bleh\n", *n); 
    return *n; 
}

コンパイルはできますが、print ステートメントはガベージ変数を吐き出します (プログラムを呼び出すたびに変数が異なります)。何か案は?

4

5 に答える 5

150
于 2013-06-23T12:54:59.210 に答える
42
char c = '5'

A char(1 バイト) がアドレス のスタックに割り当てられます0x12345678

char *d = &c;

のアドレスを取得し、cに格納しdますd = 0x12345678

int *e = (int*)d;

0x12345678が を指しているとコンパイラに想定させますintが、int は単なる 1 バイト ( sizeof(char) != sizeof(int)) ではありません。アーキテクチャやその他の値に応じて、4 バイトまたは 8 バイトになる場合があります。

cしたがって、ポインターの値を出力するとき、整数は、スタック上にある最初のバイト (つまり ) と他の連続するバイトを取得することによって考慮されます。

于 2013-06-23T12:03:13.813 に答える
3

へのポインタがありcharます。システムが知っているように、そのメモリアドレスにはスペースのchar値がありsizeof(char)ます。にキャストするとint*、 のデータを処理するsizeof(int)ため、文字とその後のメモリガベージを整数として出力します。

于 2013-06-23T12:02:55.447 に答える