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

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

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

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

Q&A

解決済

2回答

1444閲覧

Segmentation fault: 11がどうして出るのか

tssoccerboy

総合スコア8

C

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

0グッド

0クリップ

投稿2018/06/17 07:36

編集2018/06/17 13:45

前提・実現したいこと

現在、C言語プログラムを学習しているものです。

最初に数字を入力して、その入力した数字の数だけ数字入力を行い、格納した数字を出力するというコードを書きたく以下のようなプログラムを作成しました。
しかし、うまく実行ができません。原因はなぜか、またどのように修正する必要があるのか教えていただきたいです。よろしくお願いいたします。

発生している問題・エラーメッセージ

Segmentation fault: 11

該当のソースコード

C

1#include <stdio.h> 2#include <stdlib.h> 3 4int main(void){ 5 int *ip_line; //割り振られた領域のアドレスを格納するためのint型のポイント 6 int **plist; //ポインタへのポインタを宣言 7 8 /* 確保する要素数の入力 */ 9 int linesnumber,lin; 10 scanf("%d", &linesnumber); 11 lin = linesnumber; 12 //printf("%d %d\n",linesnumber,lin); 13 //linesnumber-confirm-linep 14 15 ip_line = (int **)malloc(sizeof(int *) * lin);/* lin個のint型ポインタのためのメモリー領域の確保 */ 16 17 int i; //iはデータ入力した順番の数字,nは 18 int n = 0; 19 for (i = 0; i < lin; i++) 20 { 21 //printf(" Input number of elements for array #%d : ", i+1); /* i番目のデータ配列の大きさnを指定 */ 22 scanf("%d", &n); 23 /* n個のint型変数のためのメモリー領域を確保し、そのアドレスをポインタ配列plistのi番目の要素として格納 */ 24 plist[i]=(int *)malloc(n * sizeof(int)); 25 } 26 27 for(i = n; i > 0;i--) 28 { 29 printf("%d\n",i); 30 } 31 return 0; 32}

試したこと

補足情報(FW/ツールのバージョンなど)

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

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

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

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

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

guest

回答2

0

ベストアンサー

plist の領域が確保されてません


plist=malloc(sizeof(int*)*lin);
を最初のforの前に置いときましょう

投稿2018/06/17 07:39

編集2018/06/17 07:42
y_waiwai

総合スコア87719

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

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

tssoccerboy

2018/06/17 13:08 編集

ありがとうございます。 最初のforの前に教えていただいた通りに領域を確保しました。 これで入力した数字を確保したアドレスに配置?はできているのですが、いざ入力した数字を表示する方法が上手く行きません。二つ目のfor文の中をどのように記述するのが正しいのでしょうか? よろしくお願いいたします。
y_waiwai

2018/06/17 10:33

そもそも、提示されたコードはあなたの意図したようには動いてません。 scanf("%d", &n); plist[i]=(int *)malloc(n * sizeof(int)); では、入力した数値分のint領域を確保して、plist[i]に代入しています。 入力した数値を保存してません たんに、入力した数値を保存する、というだけなら、 int* plist; ... plist=malloc(sizeof(int)*lin); ... plist[i]=n; ... と修正します
tssoccerboy

2018/06/17 13:08 編集

丁寧な対応ありがとうございます。 なるほど、、
tssoccerboy

2018/06/17 13:08 編集

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

0

代入する変数と代入される変数の型が違うために起きている”警告”です。

正しくは、
int **ip_line; 
と宣言をするか
ip_line = (int *)malloc(sizeof(int *) * lin);
とキャストをするかです。

投稿2018/06/17 08:35

van-0215

総合スコア89

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問