🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Q&A

2回答

1776閲覧

c言語でアドレス先の数値を参照するときに発生したエラーの意味を教えてください!!

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

0グッド

0クリップ

投稿2021/02/09 14:22

編集2021/02/15 03:11

C言語でポインタ変数の使い方について学んでいる最中です。Xcodeで以下のようなソースコードを打ったところ、エラーが発生してしまいました。エラーの内容と解決方法について教えてください。
ソースコード↓
#include <stdio.h>
int main()
{
int a = 123;
int b;
int *p;
printf("aのアドレスは %d \n",&a);
printf("bに代入 => ");
scanf("%d",&b);
p = b;
printf("\n");
printf("aの値は %d \n",a);
printf("bの値は %d \n",b);
printf("pのアドレスは %d \n",&p);
printf("pの値は %d \n",p);
printf("*pの値は %d \n",*p); ← エラー場所
}
エラーメッセージ ↓
Thread 1: EXC_BAD_ACCESS (code=1, address=0xffffffffefbff41c)
実行モニター(右画面)↓
aのアドレスは -272632804
bに代入 => -272632804
aの値は 123
bの値は -272632804
pのアドレスは -272632816
pの値は -272632804
(lldb)
左画面(使い道はよくわからない)↓
b int -272632804
p int * 0xffffffffefbff41c
a int 123
某動画配信サービスではこのプログラムで普通に動いていたようです。これはXcode特有で発生するエラーでしょうか?このエラーを解除する方法などがあればご教授いただきたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

BeatStar

2021/02/10 13:13

そして退会。
guest

回答2

0

これはXcode特有で発生するエラーでしょうか?

どのような場合も発生するエラーですが、エラーメッセージはMacのものです。

一般的に、アクセスしてはいけないアドレスのメモリにアクセスすることを領域外アクセスとか不正アクセスと呼びます。領域外アクセスの多くはセグメンテーション違反です。
これが起こったとき、処理系はエラーメッセージを出します。Macの場合はEXC_BAD_ACCESSというエラー目セージを出しているようです。LinuxやWindowsでは違うエラーメッセージを出します。

このエラーを解除する方法

ユーザが入力したアドレスの中身を読み出そうとすることは、入力した数字によっては実行できることもありますが、多くの場合は領域外アクセスエラーをおこします。

某動画配信サービスではこのプログラムで普通に動いていたようです。

良く見直してください。コードのどこかが少し違っていませんか?

投稿2021/02/09 22:34

ppaul

総合スコア24670

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

p = b;

p ってのはポインタ変数ですが、それに整数を入れてしまってます
これがダメですね

そのせいで、

printf("*pの値は %d \n",*p); ← エラー場所

で、アクセス違反となってます

投稿2021/02/09 14:32

編集2021/02/09 14:33
y_waiwai

総合スコア88038

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問