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

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

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

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

配列

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

Q&A

解決済

4回答

3889閲覧

C言語の動的配列

namtnamtnamt

総合スコア7

C

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

配列

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

0グッド

1クリップ

投稿2016/10/06 13:39

編集2016/10/24 12:16

C言語のことについてなんですが、
配列の動的割り付けについて質問したいです。

以下のプログラムは配列の
5個の数値をa配列に入力することとします。

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

int main(void){
int a[10];
int *p1; // ポインタ変数の宣言
int i;

p1=a; printf("5個の値を入力して下さい。\n"); for(i=0;i<5;i++){ scanf("%d", &p1[i]); } i=0; while(i!=5){ printf("%d\n", *(p1+i)); // 配列bの領域の内容を表示 i++; } free(p1);

return 0;
}

このような時、元のa配列のサイズを動的に変えて、入力サイズと同じにするには、どのようなコードを書けばいいのですか?
mallocなどのサンプルもポインタを返すため、ポインタに代入しているものしか見当たりません。
できるのかどうか、できるのならどのようなコードを書けばいいのか、
どうか教えて頂きたいです。


回答を見ていると、回答が正しいのであれば、初めに宣言した配列の先頭アドレスをポインタに入れて、そのポインタをmallocで変更した場合、初めに宣言した配列のメモリが変更されている、という意味合いにとれましたので、その内容でで納得したいと思います。
回答有難うございました。

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

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

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

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

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

guest

回答4

0

ベストアンサー

動的確保するにしても、サイズがあらかじめ分かっているならば、その分をmallocで確保すれば足ります。

###では、サイズがあらかじめ分からない場合はどうすれば良いか?
一つ目の方法としては大きめに確保しておいて、足りなくなったらその都度再確保すればいいです。これは比較的簡単です。が、結局、多めのメモリが必要となり、また再確保時にラグが必要となります。

二つ目の方法はリスト構造等の導入です。例えば以下のような構造体を用意しておきます。

C

1typedef struct MyList 2{ 3 int x; 4 struct MyList* pnext; 5} MyList;

この構造体の変数を確保すると、同じ構造体へのポインタ変数分のメモリも確保されます。従って、この構造体分のメモリを動的に確保すると、次を指し示すポインタも用意できます。この仕組みを使ってメモリを動的に確保していけばポインタ変数が不足することはありません。この仕組みをリスト構造といいます。

投稿2016/10/06 14:17

HogeAnimalLover

総合スコア4830

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

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

namtnamtnamt

2016/10/17 03:02 編集

これを使ってみたいと思いました。 なので、ベストアンサーに選ばせて頂きました。 本当に有難うございました。 今後も何卒宜しくお願い致します。
guest

0

C99から(C11でオプション機能)で可変長配列が可能となった様です。

//可変長配列の機能を使う int sz int buffer[sz];

長さは後から変更できません。変えたい場合、mallocしたのをreallocをお使いください。

投稿2016/10/07 02:00

編集2016/10/07 02:03
A.Ichi

総合スコア4070

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

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

namtnamtnamt

2016/10/17 03:03 編集

非常に分かりやすかったですし、参考になりました。 本当に有難うございました。 今後も何卒宜しくお願い致します。
guest

0

こんにちは。

C言語の場合、配列とポインタの区別は事実上ありません。
ですので、mallocで領域を獲得して処理するのが正解です。

printf("%d\n", *(p1+i)); // 配列bの領域の内容を表示

は下記のようにも書けます。(既に書いてますね。)

printf("%d\n", p1[i]); // 配列bの領域の内容を表示

一見、配列をアクセスしているように見えます。それがC言語の配列です。

free(p1);

ところで、p1はmalloc等で獲得した領域ではないのてfreeしてはいけません。

投稿2016/10/06 14:05

Chironian

総合スコア23272

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

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

namtnamtnamt

2016/10/17 02:45

p1をfreeしてしまっていた点のご指摘有難うございます。 今後も何卒宜しくお願い致します。
guest

0

C言語には一度確保した配列の領域を動的に拡張するといった機構は持ち合わせていません。配列は最初に確保したサイズのままになります。
領域のサイズが可変であることが予め分かっているのであれば、malloc等で動的に確保する方法が多く採られます。また、malloc等で領域を確保した場合、reallocでサイズを変更して割り当て直すといったことも可能です。

投稿2016/10/06 13:59

archiver

総合スコア1557

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

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

namtnamtnamt

2016/10/17 03:02

回答して頂き、本当い有難うございました。 今後も何卒宜しくお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問