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

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

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

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

Q&A

解決済

2回答

2400閲覧

C言語 特定の条件のときにrealloc関数でエラー(invalid pointer)が出て強制終了しまう

42993_

総合スコア13

C

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

0グッド

0クリップ

投稿2018/02/16 04:22

編集2018/02/17 04:21

下記のC言語のプログラムをgccでコンパイルして実行すると、最初のprintf関数が実行される前に
*** Error in `./a.out': realloc(): invalid pointer: 0x00007ffcd822789f ***
が行頭の長いエラーメッセージのようなものが出て強制終了してしまいます。

C

1#include <stdio.h> 2#include <stdlib.h> 3 4typedef struct{ 5 char name[64]; 6 int age; 7 int sex; 8} person; 9 10int main(void){ 11 int count = 1; 12 person *persons; 13 14 while(1){ 15 person per; 16 per.age = count + 10; 17 if(4 < count){ 18 break; 19 } 20 persons = (person*)realloc(persons, sizeof(person) * count); 21 persons[count - 1] = per; 22 printf("No.%d age is %d", count, persons[0].age); 23 count+=1; 24 } 25 return 0; 26}

realloc関数の部分は同じなのに、このプログラムだとエラーは出ずに実行できる。

C

1#include <stdio.h> 2#include <stdlib.h> 3 4typedef struct{ 5 char name[64]; 6 int age; 7 int sex; 8} person; 9 10int main(void){ 11 int count = 1; 12 person *persons; 13 persons = (person*)realloc(persons, sizeof(person) * count); 14 15 return 0; 16}

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

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

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

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

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

guest

回答2

0

ベストアンサー

一発メで早々にそのメッセージ/強制終了であるなら、personsをNULL初期化していないからかもしれない。

投稿2018/02/16 04:26

episteme

総合スコア16614

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

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

42993_

2018/02/16 04:32 編集

NULL初期化というものを初めて知りました、ありがとうございます。 ちゃんとNULLで初期化したらエラーが出ずに実行できました。
episteme

2018/02/16 07:27

後者は「たまたま」叱られずに済んだと思われ。
guest

0

##realloc関数で上記のエラーを出さない使い方(自己解決)
malloc関数の戻り値が代入されたポインタをrealloc関数でつかう。

###例

C

1#include <stdio.h> 2#include <stdlib.h> 3 4typedef struct{ 5 char name[64]; 6 int age; 7 int sex; 8} person; 9 10int main(void){ 11 int count = 1; 12 person *persons; 13 persons = (person*)malloc(sizeof(person) * count); // personsポインタにmalloc関数の戻り値を代入 14 count += 1; 15 persons = (person*)realloc(persons, sizeof(person) * count); // エラーは出ない 16 17 return 0; 18}

投稿2018/02/17 04:05

42993_

総合スコア13

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問