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

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

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

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

Q&A

解決済

1回答

1149閲覧

2次元配列の行成分の再確保について。

ashisandesu

総合スコア1

C

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

0グッド

0クリップ

投稿2021/11/29 11:01

現在、複数の文字列をendが入力されるまで入力して、辞書順にソートするプログラムを作っています。条件として1つ文字列につき15文字以内で行数はあらかじめ指定することはできません。
自分はreallocでメモリを再確保しようと考えたのですが、実行すると、

./sort
Input words
dfa
fdsf
dfsdf
dsfsfd
*** Error in `./sort': realloc(): invalid next size: 0x0000000000b19010 ***

というメッセージが出てしまいます。
今回のような2次配列の行成分に対して、reallocではメモリの再確保はできないのでしょうか?
また解決方法は何かあるのでしょうか?
よろしくお願いいたします。

#include <stdio.h> #include <stdlib.h> #include <string.h> #define LEN 16 int main(void) { int i, j; char **str, cp[LEN]; int n = 0; printf("Input words\n"); str = (char **)malloc( 1 * sizeof(char *)); do { str[n] = (char *)malloc( LEN * sizeof(char) ); scanf("%s", str[n]); if ( strcmp(str[n], "end") == 0 ) { break; } str = (char **)realloc( str, 1 * sizeof(char *) ); ++n; } while (1); for(i=1;i<n-1;i++) { for(j=1;j<n-1;j++) { if(strcmp(str[j-1], str[j])>0) { strcpy(cp, str[j-1]); strcpy(str[j-1], str[j]); strcpy(str[j], cp); } } } printf("\n"); for(i=0; i<n-1; i++) { printf("%s\n", str[i]); } return 0; }

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

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

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

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

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

ashisandesu

2021/11/29 11:38

同じ課題だと思います。 良いことではありませんが、途中はパクりました。
guest

回答1

0

ベストアンサー

realloc は、追加するメモリサイズを指定するのではなく、変更後の全体のメモリサイズを指定します。
貼っていただいたソースですと、いつまでたっても、サイズは 1 * sizeof(char*) のままで、配列は元の大きさのまま拡張されません。

C

1 str = (char **)realloc( str, 1 * sizeof(char *) ); 2 ++n;

この部分をそのまま活かすなら、

C

1 str = (char **)realloc( str, (n+2) * sizeof(char *) ); 2 ++n;

ですかね。
n=0 のとき、次の入力準備で 2sizeof(char) のサイズに拡張します。
n=1 のとき、次の入力準備で 3sizeof(char) のサイズに拡張します。
n=2 のとき、次の入力準備で 4sizeof(char) のサイズに拡張します。
...

投稿2021/11/29 11:29

ak.n

総合スコア291

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

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

ashisandesu

2021/11/29 11:40

基礎的な部分を勘違いしていました。 ありがとうございました。 つかぬことをお聞きしますが、C言語はどのくらいの期間触っていらっしゃるのでしょうか? Teratailだけではありませんが、インターネット上で活動をされてる多くの方がかなりの博識ぶりに見えるので。 少し気になります。
ak.n

2021/11/29 11:52

Turbo C の頃から、かれこれ、30年以上やっています。 いまはあまり使っていませんが、Cが一番、機械語に近いので、好きな言語です。 2次元配列のポインタの意味を理解されているようなので、かなり習熟されているようにお見受けしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問