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

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

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

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

Q&A

解決済

4回答

1225閲覧

メモリと構造体を用いたコード

sawayakaunagi

総合スコア17

C

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

0グッド

0クリップ

投稿2021/11/28 06:32

メモリ領域のことを勉強し始めて、メンバがchar[50],int priceの構造体Expenseを表示させたいのですが、最初の方に以下のようなコードを書いて、エラーを解決しようと模索しているうちに、頭がパンクしてしまい、以下のコードの意味もよくわからなくなってしまいました。
誰か初学者にもわかるようにコードの書き方を教えていただけませんか?

c

1コード 2#include<stdio.h> 3#include<string.h> 4#include<stdlib.h> 5 6typedef struct{ 7 char item[50]; 8 int price; 9} Expense; 10int main() { 11 // メモリの動的確保 12 int n; 13 Expense *a = (a*)malloc(n, sizeof(Expense)); 14 15 Expense product; 16 printf("名前 :"); scanf("%s", product.item); 17 printf("値段 :"); scanf("%d", &product.price); 18 19 // メモリの解放 20 free(a); 21}

c

1コンパイル結果 27-2.c: In function ‘main’: 37-2.c:12:21: error: expected expression before ‘)’ token 4 12 | Expense *a = (a*)malloc(n, sizeof(Expense)); 5 | ^

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

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

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

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

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

1T2R3M4

2021/11/28 06:36

先生とか講師に相談してみては。 独学ならばメンターサービス等をご検討されては。
dodox86

2021/11/28 08:16

いくつもの過去の質問が回答をいただいているにも関わらず開いたままですが、ひとつひとつ理解して進めましょう。誰も回答してくれなくなりますよ。むしろ、なぜ今回のような質問が今になってされるのか謎です。
hoshi-takanori

2021/11/28 09:11

n が初期化されてません。 malloc の引数は一つです。(calloc なら二つですが。) せつかく malloc したやつ使ってないんですが、何をしたいのでしょうか?
退会済みユーザー

退会済みユーザー

2021/11/29 02:55 編集

まあ処理の内容や関数の機能を調べたり理解したりせず、他人にデバッグして貰ってるだけだから、一生進歩しないわな。大人しく入門書からやり直しなさい。teratailは初心者相手に1から10まで丁寧に指導するサイトじゃないです。 [1-1. teratailはサポートセンターではなく、思考するエンジニアの為のQ&Aコミュニティです] https://teratail.com/help/question-tips#questionTips1-1 > teratailを「サポートセンター」だとは思わないでください。 > 作業依頼のような投稿をして、課題や仕事を無償でやってもらえる場ではありません。 > あなたがそのようなつもりで質問しているのだと他のユーザーから誤解されないように、丁寧な質問を心がけましょう。 もしサイトのヘルプが読めないのであれば、まず国語の勉強からすることをお勧めします。
guest

回答4

0

エラーを解決しようと模索しているうちに、頭がパンクしてしまい …(中略)…

誰か初学者にもわかるようにコードの書き方を教えていただけませんか?

Study and understand before coding.

When considering using the function malloc, you should have checked the specification of the function (before using it).
Therefore, it is usually unthinkable to give the function malloc two arguments.

Similarly, if you know the cast, you can never write (a*).

投稿2021/11/29 05:09

fana

総合スコア11996

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

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

fana

2021/11/29 05:19

> コードの書き方 という観点での話として. 初学者だろうがなかろうが,「mallocってどう使うんだっけ?」ってなったら調べる. malloc( どうのこうの ); とかコードを書く前に確認する. どこかでmallocの手前に (XXX*) みたいなのがくっついてるのを見かけたことがあるから似たような謎文字列をくっつけとけばよいかな,とかいう話ではない. コードを書くにはわからんことは調べなきゃならない. そういうことをやらない姿勢がもうダメ.
fana

2021/11/29 05:24

他の回答で > ロジックを書く と述べられているけども,それ以前の問題と言える.
guest

0

ベストアンサー

プログラミングってのは「こう書けばいい」っていうものではありません。ましてや「手当たり次第にやるもの」でもありませんロジックを書くのです。

まずメッセージを読んでください。エラ―メッセージは暴言でも罵倒でもなく、ましてやランダムに出るわけのわからないものでもなく、「コンパイラ等からのメッセージ」です。
今の状態は「相手の話を聞かずに自分で勝手な解釈をして逆ギレしている人」です。そんな人はコミュニケーションなんて取れませんよね。まずはメッセージぐらい読みましょう。

7-2.c: In function ‘main’: 7-2.c:12:21: error: expected expression before ‘)’ token 12 | Expense *a = (a*)malloc(n, sizeof(Expense)); | [訳] 7-2.cのmain関数内にて: 7-2.cの12行目でエラーがあるよ。')'の前のやつ、なんか間違ってない? Expense *a = (a*)malloc(n, sizeof(Expense)); の部分だけど。

では、7-2.cの12行目を見てください。Expense a = (a)malloc(n, sizeof(Expense));の部分です。

このExpense *a = (a*)malloc(n, sizeof(Expense));をそのまま読むと、

Expense型のサイズ(?)のn個分、動的確保してa* という型としてキャスト。そしてそれをExpense *aに入れる。

的なものです。ただし、このmalloc関数の引数部もおかしいです。ここを見ると、引数はsize_t sizeだけです。ということは、関数の使い方も間違っている。

仮に「Expense型をn個分確保する」とかだとしても、キャストするときに(a*)としている。
これは「aという型のポインタとして見なす」です。(キャストの場合)

となると、Expenseとも合わないし、そもそもこのaって本当に型としてあるのでしょうか?

つまり、基礎をないがしろにしていることが原因。まずは基礎からやりましょう!!!!

投稿2021/11/28 06:58

BeatStar

総合スコア4962

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

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

0

Expense a = (a)malloc(n, sizeof(Expense));

Expense a = (Expense)malloc(n, sizeof(Expense));

ですね

投稿2021/11/28 06:36

y_waiwai

総合スコア88042

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

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

angel_p_57

2021/11/28 06:42

malloc(n, sizeof(Expense)) にも突っ込みましょうよ。 ※それ以前になんのために malloc するのが不明なので「なんか知らんけど少なくとも使い方から間違ってる」としかコメントはできないんですが
guest

0

Expense a = (a)malloc(n, sizeof(Expense));

(a *) ここは、型を書くところです。
従って、
Expense *a = (Expense *)malloc(n * sizeof(Expense));

malloc()関数は、ポインタchar *で確保した領域を返すので、多くの場合、そのままでは使えません。
目的とする領域へのポインタ(今回は、(Expense *))に変換(キャスト)する必要があります。


malloc()について、修正。
キャストの件は、解決済みのようなので、このまま。

投稿2021/11/28 06:40

編集2021/12/04 09:18
pepperleaf

総合スコア6385

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

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

退会済みユーザー

退会済みユーザー

2021/11/29 02:51

C++ではなくC言語ではキャスト不要ですし、そもそもmallocの引数がおかしいです。
pepperleaf

2021/12/04 09:20

既に解決済みなので、放置してましたが、 malloc()のみ修正
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問