2016-03-19 8 views
1

私はこのコードを整数で試していますが、コンパイル時にキャストなしでポインタを初期化するという警告があります。 また、コンパイル後に.exeファイルが正しく実行されないようです。助けてください!警告:初期化は、キャストのない整数からポインタを生成します(整数ポインタ)

#include <stdio.h> 
#include <stdlib.h> 

int 
main(int argc, char* argv[]) { 
    int num1=10, *num2=1; 
    printf("num1=%d \t num2=%d \n", num1, *num2); 
    *num2 = num1; 
    printf("num1=%d \t num2=%d \n", num1, *num2); 

    return 0; 
} 

Error message

+0

助けてくれてありがとう! :D – Rio

答えて

5

あなたは、実装定義の方法でポインタに整数1を変換し、変換されたポインタが有効なポインタであるには余りにも少しチャンスがあります。その結果、ポインタを逆参照して値を読み書きすると、セグメンテーションフォルトが発生する可能性が大きくなります。

ポインタが指すオブジェクトを作成し、そのオブジェクトを指すポインタを持ってください。それ以降は、ポインターを使用して値の読み取りまたは書き込みを行います。

#include <stdio.h> 
#include <stdlib.h> 

int 
main(int argc, char* argv[]) { 
    int obj = 0; /* do initialize before using the value */ 
    int num1=10, *num2=&obj; 
    printf("num1=%d \t num2=%d \n", num1, *num2); 
    *num2 = num1; 
    printf("num1=%d \t num2=%d \n", num1, *num2); 

    return 0; 
} 
3

これは:

int num1 = 10; 
int *num2 = 1; 

二変数はintへのポインタで、あなたはそれに値を割り当てたり、それを初期化するとき、あなたは割り当てる:

int num1=10, *num2=1; 

に相当します住所。値が1の整数へのポインタを作成しません。

これは、警告の意味です。整数をポインタに変換します。通常、これはエラーです。

あなたはint型へのポインタをしたい場合は、両方を作成する必要があります。

int num2 = 1; 
int *pnum2 = &num2;  // pointer to num2, *num2 == 1 
0

NUM2は、ポインタです。だから、それはアドレスを格納することになっています。あなたはINTEGER VALUEを1のように決して格納することはできません。ポインタはアドレスを格納しています。変数のADDRESSを格納できます。だからnum1整数変数のアドレスであなたのnum2を初期化し、あなたのコードが動作します。ガベージ値を取り除くためにnum2を初期化しようとしている場合は、num2にNULLを格納できます。しかし、NULLポインタの逆参照は深刻な実行時エラーであるセグメンテーション・フォルトであるため、ヌル・ポインタを参照解除しないようにしてください(printf(* num2)のように)。

#include <stdio.h> 
#include <stdlib.h> 

    int main(int argc, char* argv[]) { 
    int num1=10, num2=&num1; //this is what i have changed in your code 
    printf("num1=%d \t num2=%d \n", num1, *num2); 
    *num2 = num1; 
    printf("num1=%d \t num2=%d \n", num1, *num2); 

    return 0; 
} 
+0

2番目のもの?あなたが何を言おうとしているのか分からなかった。あなたは少し精巧にできますか –

+0

ああ、そう!大丈夫、私はそれを更新しました。 :D –

関連する問題