変数、配列、構造体におけるC言語の代入
今日のメインは、以下の質問です。
C変数、配列、構造体など。アサインメント
に関する記事です。
質問元
A student asked me a question today?
! [defined a structure](https://img-blog.csdnimg.cn/20190516095846653.png) that
student.name = "abcd"; Why is it wrong? Why can't I assign a value? How should I assign a value?
ということで、しばらく様子を見ていたのですが、ようやく記事にすることができました。
変数の割り当て
int main(void){
int a = 0;
a = 1;
char ch = 'a';
ch = 97.
return 0;
}
e:\Workspace\VSCode\test>gcc h.c compiles with no errors.
基本的なデータ型(int, double, charなど)の変数は、代入や"のために初期化されているので問題ないです。
また
"です。
アサインメント
配列の割り当て
int main(void){
char str[20] = "abcd";
str = "qwer";
str[0] = '1';
}
共通課題は書かない。
今度はコンパイルでエラーになる
e:\WorkspaceVSCodeTest>gcc h.c
h.c: 関数 'main' で。
h.c:5:9: error: 配列型を持つ式への代入
str = "qwer"。
なぜかというと、基本的なデータ型の変数はOKで、配列はダメなんです。
なぜ間違っているのか、急いで言うつもりはないので、先に進みましょう。
構造の割り当て
int main(void){
struct students{
int id;
char name[10];
};
struct students bao = {};
bao.name = "abcd"; //error
or char str[20] = ""asdf;
bao.name = str;//this is also error
Of course the compilation is also an error.
1. インターネットの神様のCコンパイラの説明です。
<ブロッククオート文字配列を初期化するとき、コンパイラはその文字配列の最初の要素に初期アドレスを与えます。そして、すでにアドレスを持っている文字配列にさらに文字列を割り当て、コンパイラは文字配列の要素に値を割り当てることを想定しているのです。ですから、1つの文字配列の要素に1つの文字を割り当てることは可能ですが、文字列を割り当てることはできません
2. これは少しわかりやすいですね。
配列名 (str) 不可 定数だから左値なのであって、定数にアドレス値を割り当てるのはどうなんでしょう?
この2つを組み合わせると理解できます。
次に、この問題に対処するための私のプロセスのコードを、あなたの理解と参考のためにここに書いておきます、(コメントは実行されます)。
<ブロッククオート
学生構造体
{
<未定義
int idを指定します。
char name[10];
};
int main(void){
struct students bao = {};
printf("%d, %s\n", bao.id, bao.name); // output is 4224528, null (should be null)
// struct students bao = {3, "123"}; can. The first assignment method
// strcpy(bao.name, "bao"); // can.
// printf("%d, %s\n", bao.id, bao.name);
// bao.name = "bao"; error "stray '\351' in program" other is garbled, // bao.name = "bao"
// bao.name[0] = 'a';
// bao.name[0] = '/0';
// printf("%d, %s\n", bao.id, bao.name);
/* This works, */
// char arr[10] = "baobao";
// // bao.name = arr; //error "assignment to expression with array type"
// scanf("%s", bao.name); // can,
// printf("%d, %s\n", bao.id, bao.name);
// So scanf that kind of function is fine.
// There is also the memcpy function, which is also possible
return 0;
}
関連
-
すでに#.objで定義されているものを修正する。
-
エラー LNK2005: _main は first.obj で既に定義されています。
-
デバッグエラー MSB3073: :VCEnd がコード Solution で終了した
-
エラーが発生しました。#79: 型指定子が必要です
-
エラーが発生しました。#852: 式は完全なオブジェクト型へのポインタでなければならない
-
free(): 次のサイズが無効 (fast): 0x0000000000aa4430 問題あり
-
struct と typedef struct を徹底的に理解する
-
libstdc++-6.dll が見つからないため、コードの実行を継続できません。プログラムを再インストールすると、この問題が解決する場合があります。
-
Cコンパイル警告:代入がキャストなしで整数からポインタを作成する
-
0xffffffとは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
undefinedMakefile:***セパレータがありません。
-
Cプログラムの単純なエラー [エラー] ldは1終了ステータスを返した
-
複数形使用時:'**'の前にイニシャライザを置く解決策を期待。
-
c 言語エラー警告: 複数文字文字定数
-
Cエラー:構造体でも組合でもないものにメンバ 'xxx' を要求しています。
-
Linuxプログラムにおけるセグメンテーションフォールト(コアダンプ)の一般的な解決方法
-
C C++プログラムのランタイムプログラムは、書き込みエラーのためにDebug/1.exeを開くことができません。
-
警告: 非推奨の文字列定数から 'char *' への変換[-Write-strings] 解決法