1

以下のコードを実行したい場合、次のエラーが発生します。

Enter number1
4
Segmentation fault (core dumped)


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

int main()
{
  int *p1;int *p2;
  int n;
  printf("Enter number1\n");  
  scanf("%d",p1);
  printf("Enter number2\n");
  scanf("%d",p2);
  printf("sum:%d\n", (*p1 + *p2));
  return 0;
}
4

7 に答える 7

2

コードの変更には、*int ではなく int への宣言の変更、および を使用してこれらの変数へのポインターを渡すことが含まれます&

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

int main()
{
int p1;int p2;
int n;
printf("Enter number1\n");  
scanf("%d",&p1);
printf("Enter number2\n");
scanf("%d",&p2);
printf("sum:%d\n", (p1 + p2));
return 0;
} 
于 2013-10-26T20:31:46.637 に答える
1

これらのポインターは初期化されませんでした:

int *p1;int *p2;

...したがって、それらにはメモリが割り当てられておらず、どこを指しているのかを知る方法はありません。

scanfこれらの場所に書き込むことができることを期待しています。代わりにint p1; int p2;、これらのアドレスを使用してに渡す必要がありscanfます。

scanf("%d", &p1);
于 2013-10-26T20:29:33.747 に答える
0

あなたのscanf呼び出しは未定義の動作を引き起こします - あなたは初期化されていないポインタを渡しています。あなたが意味したことは、おそらく次のようなものです:

int p1, p2;

...

scanf("%d", &p1);

...

scanf("%d", &p2);

printf("sum:%d\n", p1 + p2);
于 2013-10-26T20:28:51.473 に答える
0

ポインタが初期化されていません。使用する前にそれらにメモリを割り当てます。そうしないと、未定義の動作になります。

p1 = malloc(sizeof(int));
p2 = malloc(sizeof(int));

さらに良いことintに、代わりに使用するだけですint *

int p1, p2;
int n;
printf("Enter number1\n");  
scanf("%d",&p1);
printf("Enter number2\n");
scanf("%d",&p2);
于 2013-10-26T20:29:24.913 に答える
0

ポインターではなく、通常の int を使用してください (ここでは必要ありません)。

#include<stdio.h>

int main()
{
    int p1;int p2;
    int n;
    printf("Enter number1\n");  
    scanf("%d",&p1);
    printf("Enter number2\n");
    scanf("%d",&p2);
    printf("sum:%d\n", (p1 + p2));
    return 0;
}
于 2013-10-26T20:30:41.690 に答える
0

Int *p1 は整数へのポインタです。初期化しないため、メモリ内の「ランダムな」場所に itoints します。p2 に scanf() しようとすると、p1 がたまたま指している場所に書き込みます。p1 が無効な場所を指しているため、未定義の動作が発生します。この場合、p1 が指す場所が割り当てられたスペースの外にあるため、セグ フォールトが発生します。

これは、p1 にメモリを割り当てることで修正できます。何かのようなもの...

int *p1 = malloc(sizeof(int));

または、p1 を int へのポインターではなく単なる int にして、scanf を czll するときにポインターを p1 に渡すことができます...

int p1;
...
scanf(...,&p1);
于 2013-10-26T20:33:21.197 に答える