質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
C

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

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

ポインタ

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

Q&A

2回答

959閲覧

ポインタのアドレスが変わってしまう

DoubutfulGuest

総合スコア6

C

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

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

ポインタ

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

0グッド

0クリップ

投稿2018/01/27 10:21

編集2018/01/27 11:03

始めまして、お世話になります。

C言語を用いて有限要素解析プログラムを作成しているときのエラーについて質問させてください。

動的に確保した配列に複数回アクセスし、都度計算をしているのですが、特定の回数のときだけ、メモリが確保されていないエラーが発生します。

ハンドルされない例外が 0x002148EB (プロジェクト名.exe) で発生しました: 0xC0000005: 場所 0xD2F1A974 への書き込み中にアクセス違反が発生しました。

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

double **dmatrix(int nr1, int nr2, int nl1, int nl2){
int i, nrow, ncol;
double **a;

nrow = nr2 - nr1 + 1; ncol = nl2 - nl1 + 1; if ((a = malloc(nrow*sizeof(double *))) == NULL){ printf("メモリなし(from dmatrix)\n"); exit(1); } a = a - nr1; for (i = nr1; i <= nr2; i++) a[i] = malloc(ncol*sizeof(double)); for (i = nr1; i <= nr2; i++) a[i] = a[i] - nl1; return(a);

}

void fnc1(){
int i, j, k;
double **M;
M = dmatrix(1, 3, 1, 3);
k = 1;
do{
for (j = 1; j <= 3; j++){
for (i = 1; i <= 3; i++){
if (i == j) {
M[i][j] = 25 / 6;
}
else{
M[i][j] = 25 / 12;
}
}
}
k++;
} while (k <= 400);
}

int main(){
fnc1();
}

C言語

ループを回していくと最初は順調に回るのですが、k=257のときi=1、k=258のときi=3メモリが確保されていないエラーが発生します。(jはどの値でも同じエラーが出ます。)kを259にするするとエラーはなくなりました。

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

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

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

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

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

yumetodo

2018/01/27 10:28

括弧{}の対応がおかしいのと、動的確保と言いつつ配列使っているのはどういうことなんですかね・・・
DoubutfulGuest

2018/01/27 10:33

ご連絡ありがとうございます。すみません、わかりやすさのために省略してしまっています。実際にはM[4][4]となっている部分は関数を使って1~3ずつで確保しています。動的確保の部分は参考書からとってきたので、載せられないかと思っていました。{}の対応が間違っているのも、Mの計算移行の部分を省略する際の間違いです。修正いたします。
yumetodo

2018/01/27 10:38

動的確保部分が悪い気がしているので、そこがないと話が進みません
KSwordOfHaste

2018/01/27 10:58 編集

こういう場合、そのままコンパイルできる最小の完全なコードを提示すべきです。下手に省略すると再現しませんし。閲覧者がコードの意味を把握しきれません。原因がわからないのですから省略してはいけません。 https://teratail.com/questions/110771 このQ&Aのthink49さんのコメントが大変有用だと思いますで一読の価値ありです。
DoubutfulGuest

2018/01/27 11:05

ご指摘ありがとうございます。大変なご迷惑をおかけしておりまして、恐縮です。勉強します。
Zuishin

2018/01/27 11:14

太字が使えるなら質問を見直してみてください。インデントがすべて消えています。#include の # も消えています。見にくくありませんか? 気持ち悪くありませんか?
DoubutfulGuest

2018/01/27 11:23

大変失礼いたしました。質問できるレベルには至っていないことを痛感いたしましたので、出直してきます。ご協力いただきありがとうございました。
otn

2018/01/27 11:26

いえいえ。大丈夫ですよ。スキルレベルは今のままで良いので、ちゃんと質問してください。
guest

回答2

0

C言語の配列は0から始まります。mallocで領域を確保した配列も同様です。ソースでは配列の要素数は3なので、[]で指定する添え字の範囲は0~2ということになります。ところが、実際に渡している値は1~3です。添え字に範囲外の値を渡すと、確保していない領域に対するアクセスとなり、アクセス違反になります。

投稿2018/01/27 11:16

catsforepaw

総合スコア5938

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

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

0

そもそもコンパイルすら通らないんですが、一体どうやって実行したんだ

prog.c: In function 'dmatrix': prog.c:9:12: error: incompatible types when assigning to type 'double' from type 'void *' if ((a = malloc(nrow*sizeof(double *))) == NULL){ ^ prog.c:16:35: error: subscripted value is neither array nor pointer nor vector for (i = nr1; i <= nr2; i++) a[i] = malloc(ncol*sizeof(double)); ^ prog.c:17:35: error: subscripted value is neither array nor pointer nor vector for (i = nr1; i <= nr2; i++) a[i] = a[i] - nl1; ^ prog.c:17:42: error: subscripted value is neither array nor pointer nor vector for (i = nr1; i <= nr2; i++) a[i] = a[i] - nl1; ^ prog.c: In function 'fnc1': prog.c:24:6: error: incompatible types when assigning to type 'double **' from type 'double' M=dmatrix(1,3,1,3); ^ prog.c:25:5: error: 'k' undeclared (first use in this function) k = 1; ^ prog.c:25:5: note: each undeclared identifier is reported only once for each function it appears in prog.c:27:14: error: 'j' undeclared (first use in this function) for (j = 1; j <= 3; j++){ ^ prog.c:28:18: error: 'i' undeclared (first use in this function) for (i = 1; i <= 3; i++){ ^ prog.c:30:31: error: 'delta' undeclared (first use in this function) M[i][j] = delta[k] / 6; ^~~~~ prog.c:39:1: error: expected ';' before '}' token } ^ prog.c:41:5: warning: 'main' is normally a non-static function [-Wmain] int main(){ ^~~~ prog.c: In function 'main': prog.c:42:5: warning: implicit declaration of function 'func1'; did you mean 'fnc1'? [-Wimplicit-function-declaration] func1(); ^~~~~ fnc1 prog.c: In function 'fnc1': prog.c:43:1: error: expected declaration or statement at end of input } ^ prog.c:23:14: warning: variable 'M' set but not used [-Wunused-but-set-variable] double **M; ^ At top level: prog.c:41:5: warning: 'main' defined but not used [-Wunused-function] int main(){ ^~~~

https://wandbox.org/permlink/b7YaUibUVqxQV20R

投稿2018/01/27 10:44

yumetodo

総合スコア5850

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

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

DoubutfulGuest

2018/01/27 10:55

お手数をおかけしてすみません。大変失礼しました、コピペしたので大丈夫と思っていましたが、関数dmatrixはdouble **dmatrix(int nr1, int nr2, int nl1, int nl2)と記載しています。
Eki

2018/01/28 02:45

いまさらすぎる気がしますが、ようは、ダブルポインタの ** が Markdown で太字にする記法と解釈されてしまい、 **が表示されるかわりに太字部分ができてしまったということですね。 ソースコードを貼り付けるときは、質問投稿画面の <code> というボタンを押し、出てきた ```ここに言語を入力 コード ``` とある部分の「コード」の部分をソースコードに置き換えてください。「ここに言語を入力」とある部分を "c" に置き換えると、いい感じにハイライトしてくれます。 記述例: ```c #include <stdio.h> int main(void) {} ```
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問