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

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

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

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

Q&A

解決済

3回答

1137閲覧

segmentation faultと出る原因がわかりません

nagano-yuhi

総合スコア39

C

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

0グッド

0クリップ

投稿2021/07/30 06:37

2次元配列を90度左回転する問題で、コンパイルはできたんですが、実行するとsegmentation faultと出ます。原因がわかりません。良ければ教えてください。

#include <stdio.h> #include <stdlib.h> #include <time.h> void rotate(int N, int **m){ int i, j, start, end; int temp; j=0; end=N; for(start=0;start<N/2;start++){ end--; for(i=start;i<end;i++){ temp=m[j][N-1-i]; m[j][N-1-i]=m[N-1-i][N-1-j]; m[N-1-i][N-1-j]=m[N-1-j][i]; m[N-1-j][i]=m[i][j]; m[i][j]=temp; } j++; } return; } int main(void){ int i, j, N; N=64; int **m=(int**)malloc(N*sizeof(int*)); m[0]=(int*)malloc(N*N*sizeof(int)); /* for(i=0;i<N;i++){ for(j=0;j<N;j++){ m[i][j]=i+j; printf("%2d ", m[i][j]); } printf("\n"); }*/ time_t start_time, end_time; start_time=time(NULL); rotate(N, m); end_time=time(NULL); printf("time:%ld\n", end_time-start_time); /*for(i=0;i<N;i++){ for(j=0;j<N;j++){ printf("%2d ", m[i][j]); } printf("\n"); }*/ return 0; }

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

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

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

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

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

guest

回答3

0

ベストアンサー

c

1 int **m=(int**)malloc(N*sizeof(int*)); 2 m[0]=(int*)malloc(N*N*sizeof(int)); 3

m[1] から m[63] が未初期化です。
int の N * N の2次元配列なら、m[0] から m[63]malloc(N * sizeof(int)) で初期化する必要があるのでは。

投稿2021/07/30 06:44

int32_t

総合スコア21012

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

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

0

int m=(int)malloc(Nsizeof(int));
m[0]=(int*)malloc(NNsizeof(int));

これじゃm[1]以降の値は全く謎ですよね.
謎の値をアドレス値として何かしようとしたなら,まぁ,Segmentation Fault にもなり得ます.

投稿2021/07/30 06:43

fana

総合スコア11708

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

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

nagano-yuhi

2021/07/30 13:54

ありがとうございました
guest

0

int **m=(int**)malloc(N*sizeof(int*)); m[0]=(int*)malloc(N*N*sizeof(int));

m[1]~m[N-1] が初期化されていない。

投稿2021/07/30 06:43

編集2021/07/30 07:09
episteme

総合スコア16614

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

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

episteme

2021/07/30 06:53

カブりまくり。タッチの差で僕の勝ちwww > fana, int32_t
int32_t

2021/07/30 06:56

┐(´Д`)┌オテアゲ
fana

2021/07/30 06:59

投稿前のリロード確認作業がかえって仇となったか…
fana

2021/07/30 07:04 編集

全然関係ないけど,私のブラウザでは引用部分の m=(int だけが太字で表示されてる.何でだろ? ↓ ああ,** が強調に解釈されてちゃってるのか.(引用内でも効くのか)
K_3578

2021/07/30 07:05

>fanaさん **m=(int** ってなってるから太字扱いになってるんだと思います
episteme

2021/07/30 07:09

コッソリ修正 > **問題
fana

2021/07/30 07:10

コードを引用する際には注意が必要そうですねコレ. (3人中2人がこの罠にひっかかり,1人は引っかからなかった.真の勝者とは誰か…?)
episteme

2021/07/30 07:16

C/C++ならでは、ですな。
nagano-yuhi

2021/07/30 13:54

ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問