#include <stdio.h> #include <limits.h> int main() { int num; char str[]; num = 1996, printf("%d",num); str[]="HELLO c"; printf("%s",str); } ```### 前提・実現したいこと ### 発生している問題・エラーメッセージ 内定先の課題でc言語の基礎をやっているのですが、strのサイズが不明というエラーが出てしまいます。どうしたらよいのでしょうか? ### 該当のソースコード ```ここに言語名を入力 ソースコード
試したこと
ここに問題に対して試したことを記載してください。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/12/25 07:40
2020/12/25 07:49 編集
2020/12/25 07:58
2020/12/25 07:59
2020/12/25 12:19
2020/12/25 14:58
回答4件
0
あなたの書いたCソースプログラムをコンパイルするとき、コンパイラは、それを機械命令に翻訳します。
コンパイラが機械命令を作り出すとき、機械命令に変数の場所を教えてあげます。
例えばmain関数の int num; というのを見たコンパイラは、以下のように考えます。
このnumという名前は、main関数の中で宣言されているから自動変数なのだな。だったら、スタックのここに置くことにしよう。int型だから4バイトの場所を取っておけばいいな。(コンピュータのCPUやOSによっては8バイトの場合もあります)
次に、char str[]; を見たコンパイラは、以下のように考えます。
strという名前はmain関数の中で宣言されているから自動変数なのだな。だったら、スタックのここに置くことにしよう。文字の配列だけど長さを書いていないから何バイト取ればいいかわからない。困った、エラーメッセージを出して中止しよう。
もしも、char str[]="HELLO c";と書いてあったなら、コンパイラは、これを入れるなら8バイトあればいいな、あとそこにはHELLO cという7文字と終了文字1文字を入れておこう、と思って仕事を続けます。こういう文を変数の初期化といいます。
配列ではない変数を初期化する場合は int i = 42; で代入に似ていますね。
このために、配列に対する代入文が str[]="HELLO c"; と書けそうな気しますね。
それが出来ない理由は、コンパイラは何バイトコピーするかが分からないからなのです。
詳しい説明は長くなるので省略しますが、Cというコンパイラ言語を作ったときに、OSを作ることが出来るような仕様にしたことが影響しています。
ということで、コンパイラに分かることと分からないことがあるとか、コンパイラを作ったときに事情でCの文法はそうなっているのです。皆さんが書いているように、間違った文法で書くとコンパイラが困りますので、文法はは覚えておいてください。
投稿2020/12/25 11:38
総合スコア24670
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/12/25 13:07
2020/12/25 14:48
2020/12/26 02:42
0
自己解決
#include <stdio.h>
#include <limits.h>
int main()
{
int num = 1996;
char str[7]="HELLO c";
printf("%s",str);
printf("%d",num);
return;
}
投稿2020/12/25 13:38
総合スコア6
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/12/25 23:03 編集
2020/12/26 02:09
2020/12/26 03:00
0
strのサイズが不明というエラーが出てしまいます。どうしたらよいのでしょうか?
指摘されているとおり、配列strのサイズが不明なので、宣言時に要素数を指定してください。
要素数は、後でコピーする文字列が入るのに十分な数を確保しておきます。
Diff
1- char str[]; 2+ char str[10];
そして、次は文字列のコピーの仕方を調べて、プログラムを書き換えてください。
投稿2020/12/25 07:48
総合スコア11990
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/12/25 07:57
2020/12/25 10:36 編集
2020/12/25 08:10
2020/12/25 08:13
2020/12/25 08:17 編集
2020/12/25 08:59
2020/12/25 09:05
2020/12/25 09:07
2020/12/25 09:09
2020/12/25 09:37
2020/12/25 09:49
2020/12/25 10:05 編集
2020/12/25 10:04
2020/12/25 10:17
2020/12/25 10:23
2020/12/25 10:35 編集
2020/12/25 10:37
2020/12/25 11:07
2020/12/25 11:08
2020/12/25 11:09
2020/12/25 11:10
2020/12/25 11:22 編集
2020/12/25 11:32
2020/12/25 11:34
2020/12/25 11:49
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。