2

次の構造で名前を初期化しようとすると、 「 error: incompatible types when assigning to type 'char[10]' from type 'char *' 」というエラー メッセージが表示されます。

#include <stdio.h>

struct info
{
  char name[10]; 
  int years;
};

int main(void){
  struct info  b;

  b.name = "Michael";
  b.years = 19;
  return 0 
;}
4

6 に答える 6

4

構造体を初期化しようとしているだけなので、おそらく次のように回避できます。

 struct info b = {"Michael", 19};

C では、初期化と代入を区別しています (同じ演算子を使用していますが)。配列を代入することはできません (memcpyまたは代わりに類似のものを使用する必要があります) が、イニシャライザが指定する特定の値でデータが存在する可能性があります。

于 2012-06-06T05:05:43.057 に答える
2

配列は C のポインターではありません。文字列を別の場所にコピーするには、 strcpyが必要です。

于 2012-06-06T04:45:40.187 に答える
2

代わりにこれを使用してください:

strcpy(b.name,"Michael");
于 2012-06-06T04:36:05.183 に答える
1

実行時に何が起こるか見てみましょうmain()

struct info  b;

これによりstruct、 を含めてを初期化しnameます。

name char 配列 (ジェイが指摘したように、ポインターとは異なります)であり、ランダムなものを含むメモリのチャンクが割り当てられます。

b.name = "Michael";

これにより、文字列リテラルを char 配列に割り当てようとします。

通常、このような宣言でchar配列に文字列リテラルを割り当てますchar a[] = "hello";

文字列リテラルをメモリのチャンクにコピーし、a「メモリを脇に置きます」。ただし、あなたの場合、b.nameすでに別のメモリのチャンクを確保しており、配列はポインタではないため、割り当てを行うだけでその状態を変更することはできません。

したがって、変更したい場合は、Vaughn Cato が言ったようにb.name使用するか、その文字を次のように文字で実行します。strcpy

b.name[0] = 'M';
b.name[1] = 'i';
...

これは本質的に「strcpy」と同じです

于 2012-06-06T05:34:34.047 に答える
0

問題は、name のアドレスが必ずそれを含む info オブジェクトのメモリ内にあるのに対し、文字列リテラルはメモリの別の領域にあることです。コンパイラは、プログラム内で言及されている場所を考慮して、それらの場所が適切であることを確認し、任意に移動またはマージすることはできません。また:

  • namea に変更し、リテラルを指す必要がありますconst char*(ここではconst char*、文字列リテラルを変更してはならないため)、または
  • リテラルからのコンテンツstrcpy()-ied (ただし、常にテキストと終了 ASCII NUL/0 文字に十分な大きさでnameあることを確認するように注意する必要があります)、またはname
  • nameに変更され、リテラルchar*のヒープ割り当てコピーに割り当てられます (これにより、後でstrdup()変更できるようになり、によって制御されるメモリはリテラルのコピーを格納するのに十分な大きさになりますが、終了したら必要になります)それと)。namenamefree(name)
于 2012-06-06T05:16:52.553 に答える
0

その場合char name[10]、変数がベースアドレスにアクセスできるメモリを静的に割り当てていnameます。アドレス ポインターを静的に割り当てられた配列に変更することはできません。nameつまり、別のアドレスを変数に追加することはできません。

b.name = "Micheal" を実行すると、まさにそれが実行されます。「Micheal」文字列のベースアドレスをname変数に追加しようとしています。

@Vaughnが言ったようにそれを行うには、「Micheal」をb.nameが指すメモリにコピーします。または構造内で、に変更char name[10]しますchar *name

于 2012-06-06T04:43:07.037 に答える