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

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

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

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

1474閲覧

C言語 配列要素数の動的確保

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/06/04 03:00

前提・実現したいこと

・実現したいこと
配列の要素数をループの回数にしたいことが目的とした数字を2つ入力してもらい、ファイルとターミナルに表示するプログラムの出力ミスの原因の理解
おそらく動的確保の方法が間違っているとは思いますが、考えてもわからなかったため質問させていただきます。

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

数字1と2を入力形式(1,2)として入力してください(両方0入力で終了): 1,1 数字1と2を入力形式(1,2)として入力してください(両方0入力で終了): 1,1 数字1と2を入力形式(1,2)として入力してください(両方0入力で終了): 1,1 数字1と2を入力形式(1,2)として入力してください(両方0入力で終了): 0,0 x = 1, y = 1 x = 1, y = 1 x = 1, y = 1513857330 result.csv ファイルへの出力を終えました

エラーではありませんが、出力時にyの最後の値がおかしい値になっています。
また、4回以上入力をすると出力ファイルが開けないという結果になります。

該当のソースコード

C

1#include <stdio.h> 2#include <stdlib.h> 3 4int main(void){ 5 int *ipx,*ipy; //int型ポインタ 6 int i,count; //カウンタ 7 8 FILE *fp; //ファイルポインタ 9 char *fname = "resultaaa.csv"; //出力ファイル名 10 11 /* メモリ領域の確保 */ 12 ipx = (int *)malloc(sizeof(int)); 13 ipy = (int *)malloc(sizeof(int)); 14 15 /* 配列要素の格納、表示 */ 16 i = 0; 17 while(1){ 18 printf("数字1と2を入力形式(1,2)として入力してください(両方0入力で終了): "); 19 scanf("%d,%d",&ipx[i],&ipy[i]); 20 //終了条件 21 if(ipx[i] == 0 && ipy[i] == 0) break; 22 i++; 23 } 24 25 /* ファイルオープン処理 */ 26 fp = fopen(fname,"w"); 27 if(fp == NULL){ 28 printf("%sファイルが開けませんでした。\n",fname); 29 return -1; 30 } 31 32 /* ファイル、ターミナル出力 */ 33 count = 0; 34 while(count < i){ 35 printf("x = %d, y = %d\n",ipx[count],ipy[count]); 36 fprintf(fp,"%d,%d\n",ipx[count],ipy[count]); 37 count++; 38 } 39 40 /* ファイルクローズ */ 41 fclose(fp); 42 printf("%s ファイルへの出力を終えました。\n",fname); 43 44 /* メモリ解放 */ 45 free(ipx); 46 free(ipy); 47 48 return 0; 49}

試したこと

ここに問題に対して試したことを記載してください。

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答2

0

ベストアンサー

ipx = (int *)malloc(sizeof(int));
ipy = (int *)malloc(sizeof(int));

では、int一個分の領域しか確保できていません。幾つ入力するか入力して、その分を確保しましょう。
動的に確保するならrealloc()等で、領域を増やすことも出来ます。(reallocはポインタが変わる可能性が有るので古いポインタを上書きしないように)
確保したメモリ領域のサイズを変更する
ちなみに↑で解説している“if ((ptr = (int *)realloc(ptr, sizeof(int) * 15)) == NULL)”では、同じポインタ(ptr)を使っていますが、reallocに渡すptrと復帰値を受け取るptrは別物にして下さい。で、違った場合は古いptrを開放(free)して新しい方を使いましょう。

投稿2020/06/04 03:14

編集2020/06/04 05:29
cateye

総合スコア6851

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

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

退会済みユーザー

退会済みユーザー

2020/06/04 03:20

回答ありがとうございます。こだわっているわけではありませんが、配列要素数を最初に決めない(ループの回数)ことにはこだわっております。realloc()という考え方は知らなかったため、実装をしてみようと思います。
angel_p_57

2020/06/04 04:09

> で、違った場合は古いptrを開放(free)して新しい方を使いましょう。 古い方を呼び出し側でfree()するという決まりはなかったように思います。逆に変にfree()すると二重解放のおそれがあります。 https://linuxjm.osdn.jp/html/LDP_man-pages/man3/malloc.3.html より > realloc() は、(略) ptr が指す領域が移動されていた場合は free(ptr) が実行される。 free() は realloc()内部で自動的に行われるように読めますね。
退会済みユーザー

退会済みユーザー

2020/06/04 05:02 編集

ミスです。
退会済みユーザー

退会済みユーザー

2020/06/04 05:02

angel_p_57さんの参照しているサイトで自動で行われるように書いてあったため、記述しなかったところ正常に動きました。ご指摘ありがとうございます。 cateyeさんのご指摘のrealloc()をうまく使用し、複雑にはなってしまいましたが実現したいことが実現できました。本当にありがとうございました。
cateye

2020/06/04 05:36

誤記(勘違い)が有りました。訂正します。
guest

0

C

1 /* メモリ領域の確保 */ 2 ipx = (int *)malloc(sizeof(int)); 3 ipy = (int *)malloc(sizeof(int));

それぞれint 1個分しか確保してない。
n組入力したいなら n個分確保しなさい。

投稿2020/06/04 03:04

episteme

総合スコア16612

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

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

退会済みユーザー

退会済みユーザー

2020/06/04 03:18

回答ありがとうございます。n組入力したいのですがipx = (int *)malloc(n*sizeof(int))としてその段階ではnの数が決まらない場合(ここではループの回数をnとしたいのですが)はこの定義の仕方でよいのでしょうか?
episteme

2020/06/04 03:32

ダメに決まってます。 reallocするか、さもなくば 1 新たに(少し大きめの)領域を確保 2.旧領域から新領域へコピー 3.旧領域を廃棄
退会済みユーザー

退会済みユーザー

2020/06/04 05:03

簡潔にご指摘してくださりありがとうございます。解決することができました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問