1. ホーム
  2. C言語

変数、配列、構造体におけるC言語の代入

2022-02-10 02:19:03

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;
}