0

これは私のコードです:

typedef struct{
  char name[64];
} Cat;

Cat createCat(char name[64]) {
  Cat newCat;

  newCat.name = name;

  return newCat;
}

コンパイルすると、次のエラー メッセージが表示されます。

タイプ 'char *' からタイプ 'char[64]' に代入するときの互換性のないタイプ

ここで何が間違っていますか?

4

3 に答える 3

7

関数に渡されると、配列はポインターに減衰します。そう:

Cat createCat(char name[64]) {

以下と同じです:

Cat createCat(char* name) {

と行:

newCat.name = name;

エラーが示すように、char*をに割り当てようとしています。Mysticalが既にコメントしているように、または (または) を使用char[]してにコピーする必要があります。使用する場合は、null terminate を覚えておく必要があります。memcpy()strcpy()strncpy()namenewCat.namememcpy()newCat.name

于 2012-08-06T15:23:46.863 に答える
0

うわぁ。関数から自動(スタックベース)変数を返しています。スタックフレームがポップされてメモリがなくなると、それは恐ろしく死にます。構造を動的に割り当て、データをCatその構造にコピーする必要があります。記憶が終わったら、 name忘れずに電話してください。free()

Cat *createCat(char name[64])
{
Cat *tmpCat;
tmpCat=malloc(sizeof(Cat));
strncpy(Cat.name,name,64); // <- or 63 to make sure name is NULL-terminated
return tmpCat;
}
于 2012-08-06T15:26:46.530 に答える
0

あなたのコードには 2 つのバグがあります。1 つ目は、スタックにメモリを割り当てていることです。次のように変数を宣言するときはいつでも:

int hello = 5;
char test;
Cat newCat;

スタックにメモリを割り当てています。このメモリは、関数が戻るとすぐに解放されます。何かをより永続的にするには、malloc 関数を使用して手動でヒープにメモリを割り当てる必要があります。このメモリは、後で を呼び出して解放するまで有効ですfree()。さらに、strncpy()文字列をコピーするために使用する必要があります。単純にポインターをコピーすることはできません。

Cat* createCat(char* name)
{
     Cat* newCat = malloc(sizeof(Cat));
     if(!newCat)
     {
            printf("Error allocating memory for cat\n");
            exit(-1);
     }
     //copy in the string, leave a null terminator on the string
     strncpy(newCat.name, name, 63);
     newCat.name[63] = '\0'; 
     return newCat;
}
于 2012-08-06T15:38:14.883 に答える