固定要素数の行列の処理ですが、subでセグメントエラーを起こしています。
アドレスを出力してみると、subでは元々確保したアドレスでは無いところを指しています。
呼び出し側では「行列の先頭のアドレス」を明示したつもりだったのですが、どこが間違っているのでしょうか。少し長いですが、ソースコードと出力を示します。
typedefのところとsubのIFは変更できないので、double[3][3]とdouble** のIFを合わせないといけないのですが、合わせ方がよくわかりません。
よろしくお願いします。
=========================================
#include <stdio.h>
#include <string.h>
typedef double Matrix[3][3];
void sub( const double** mat );
int main(void)
{
int ret = 0;
int i, j;
Matrix mat = { { 0., 1., 2. },
{ 3., 4., 5. },
{ 6., 7., 8. } };
for( i = 0; i < 3; i++ ){
for( j = 0; j < 3; j++ ){
printf( "main : mat[%d][%d] = %f\n", i, j, mat[i][j] );
printf( "main : &mat[%d][%d] = %p\n", i, j, &mat[i][j] );
}
}
printf( "\n" );
sub( &mat[0][0] );
return ret;
}
void sub( const double** mat )
{
int i, j;
printf("---- &mat = %p\n", &mat );
for( i = 0; i < 3; i++ ){
for( j = 0; j < 3; j++ ){
printf( "sub : mat[%d][%d] = %f\n", i, j, mat[i][j] );
printf( "sub : &mat[%d][%d] = %p\n", i, j, &mat[i][j] );
}
}
printf( "\n" );
}
=========================================
main : mat[0][0] = 0.000000
main : &mat[0][0] = 0x7ffffca7bca0
main : mat[0][1] = 1.000000
main : &mat[0][1] = 0x7ffffca7bca8
main : mat[0][2] = 2.000000
main : &mat[0][2] = 0x7ffffca7bcb0
main : mat[1][0] = 3.000000
main : &mat[1][0] = 0x7ffffca7bcb8
main : mat[1][1] = 4.000000
main : &mat[1][1] = 0x7ffffca7bcc0
main : mat[1][2] = 5.000000
main : &mat[1][2] = 0x7ffffca7bcc8
main : mat[2][0] = 6.000000
main : &mat[2][0] = 0x7ffffca7bcd0
main : mat[2][1] = 7.000000
main : &mat[2][1] = 0x7ffffca7bcd8
main : mat[2][2] = 8.000000
main : &mat[2][2] = 0x7ffffca7bce0
---- &mat = 0x7ffffca7bc68
セグメンテーション違反です
No.3
- 回答日時:
>matの宣言はポインタのポインタでなく、*を1つでよいのでは?
さすがに、それはまずいでしょう。
そういうソースコードを書いて、ご自分で試してみましたか?
>以下、質問者さんへ
いわゆる2次元配列(各要素が配列であるような配列)と
ダブルポインターとは似て非なるものでありまして、
今回の例だと
(*mat)[3]
という具合に、sub関数に渡す引数を
「要素数3の配列へのポインター」とする必要があるかもしれませんし、
もっといい方法があるのかもしれません。
ご回答ありがとうございます。
配列とポインタは本当は違うものだという解説は、以前どこかで読んだことがあって、その時は「なるほどな~」と思ったものですが、やはり完全に理解できていなかったようです。
本当は、引数の「double**」の他にも引数があって、当然ですが行と列の要素数も引数にあります。この質問では、要素数固定として簡略化したんですが、ダブルポインタの箇所そのものを変更する必要があるかも、ということですね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語でユーザ関数を利用して複素数のべき乗と絶対値の数列を計算するプログラムが作りたいです。 3 2023/01/29 22:13
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
- C言語・C++・C# プログラミングペーパーテスト 次の問題の実行結果を答えろ #include int x[ ] = { 1 2022/06/16 21:49
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
- C言語・C++・C# プログラミングの授業のペーパーテスト 実行結果を答えろ #include int x[ ] = {1 3 2022/06/16 20:08
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# C言語: ポインタ 5 2022/06/01 08:33
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
C言語 関数プロトタイプ宣言の...
-
doubleの変数にintとintの割り...
-
(C言語)ニュートン法のプログ...
-
C言語のデバック 領域の二重解...
-
C++で割り算の結果を昇順に出力...
-
C言語のプログラムで質問です。
-
C言語で内積、、、わかりません。
-
関数におけるif文とreturn文に...
-
初めてCを触って、困っています
-
-1.#IND00と出てしまうのですが...
-
C言語の型による処理速度の違い
-
atan2 オーバーロード関数の呼...
-
float型とdouble型の変数の違い...
-
C言語のpow関数の不具合
-
c言語で、繰り返し文の中で、0....
-
C言語における複素数の四則演算...
-
C言語
-
#define _CRT_SECURE_NO_WARNIN...
-
【C++】関数ポインタの使い方
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
C言語を実行すると-infが出てき...
-
float型とdouble型の変数の違い...
-
doubleの変数にintとintの割り...
-
c言語で、繰り返し文の中で、0....
-
C言語 関数プロトタイプ宣言の...
-
関数におけるif文とreturn文に...
-
C 開放してるのにエラー(doubl...
-
C言語の型による処理速度の違い
-
至急です! マクロ定義で #defi...
-
doubleは常に%lfとするべきなのか
-
Cで3乗根を求める方法
-
-1.#IND00と出てしまうのですが...
-
C言語で-23乗を取り扱うには
-
C++で外積
-
2次方程式の解を求めるプログ...
-
方程式を2分法を用いて解くプロ...
-
ニュートン法
-
c言語のコンパイルエラー canno...
-
difftime()について
おすすめ情報