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

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

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

ソースコードを単体で実行可能なソフトウェアへ変換する過程をビルド(build)と呼びます

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

658閲覧

二重ポインタを用いるには

andersong

総合スコア7

ビルド

ソースコードを単体で実行可能なソフトウェアへ変換する過程をビルド(build)と呼びます

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/10/25 06:31

二重ポインタを使いたいのですがうまくいきません。

成績を表示するプログラムを書いているのですが

#ifndef __Seiseki__h #define __Seiseki__h #include <stdio.h> #include <stdlib.h> // データ型宣言 typedef struct { const char* name; int kokugo; int sansuu; int rika; int shakai; } Seiseki; // プロトタイプ宣言 Seiseki * makeSeiseki(const char*, int, int, int, int); void print(Seiseki*); void free(Seiseki*); #endif // __Seiseki__h
#include "Seiseki.h" // 成績の生成(コンストラクタ) Seiseki * makeSeiseki(const char* n, int k, int m, int r, int h) { Seiseki * s = (Seiseki*)malloc(sizeof(Seiseki)); s->name = n; s->kokugo = k; s->sansuu = m; s->rika = r; s->shakai = h; return s; } // 成績の表示 void print(Seiseki * s) { printf(" % s 国 % d 算 % d 理 % d 社 % d \n", s->name, s->kokugo, s->sansuu, s->rika, s->shakai); } // 成績の解放 void free(Seiseki * s) { free((void*)s); }
#include "Seiseki.h" int main() { Seiseki **s; s = (Seiseki**)malloc(3*sizeof(Seiseki*) ); s[0] = makeSeiseki("山田太郎", 78, 55, 80, 88); s[1] = makeSeiseki("佐藤花子", 90, 80, 85, 87); s[2] = makeSeiseki("中村裕次郎", 40, 62, 72, 21); for (int i = 0;i < 3;i++) print(s[i]); for (int i = 0;i < 3;i++) free(s[i]); free(s); }

3つ目のソースコードを

#include "Seiseki.h" int main() { Seiseki *s[3]; s[0] = makeSeiseki("山田太郎", 78, 55, 80, 88); s[1] = makeSeiseki("佐藤花子", 90, 80, 85, 87); s[2] = makeSeiseki("中村裕次郎", 40, 62, 72, 21); for (int i = 0;i < 3;i++) print(s[i]); for (int i = 0;i < 3;i++) free(s[i]); }

から二重ポインタを使うように変えてみたのですがエラーはなくビルドが失敗となります。
3つ目のソースコードのどこを修正すればよいでしょうか。

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

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

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

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

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

guest

回答2

0

自己解決

コンソーラーを立ち上げなおしたところ出力されました。

何かしらの不具合でした。

投稿2020/10/25 08:35

andersong

総合スコア7

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

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

0

C

1 // 成績の解放 2 void free(Seiseki * s) { 3 free((void*)s); 4 5}

この関数は「自分自身を呼び出す」という意味になってしまいます。<stdlib.h>freeを呼びたいのなら、自作の関数をfreeでない名前で定義する必要があります。

投稿2020/10/25 06:36

maisumakun

総合スコア146018

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

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

maisumakun

2020/10/25 06:36

なお、これ以外に間違いがある可能性は否定できません。
andersong

2020/10/25 06:46

回答ありがとうございます。 変更したのが3つ目のソースコードの二重ポインタのあたりだけだったのですがその部分も変更しないといけないのでしょうか。 一応変更前はうまく動いてくれたので…
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問