これは私のコードです:
typedef struct{
char name[64];
} Cat;
Cat createCat(char name[64]) {
Cat newCat;
newCat.name = name;
return newCat;
}
コンパイルすると、次のエラー メッセージが表示されます。
タイプ 'char *' からタイプ 'char[64]' に代入するときの互換性のないタイプ
ここで何が間違っていますか?
これは私のコードです:
typedef struct{
char name[64];
} Cat;
Cat createCat(char name[64]) {
Cat newCat;
newCat.name = name;
return newCat;
}
コンパイルすると、次のエラー メッセージが表示されます。
タイプ 'char *' からタイプ 'char[64]' に代入するときの互換性のないタイプ
ここで何が間違っていますか?
関数に渡されると、配列はポインターに減衰します。そう:
Cat createCat(char name[64]) {
以下と同じです:
Cat createCat(char* name) {
と行:
newCat.name = name;
エラーが示すように、char*
をに割り当てようとしています。Mysticalが既にコメントしているように、または (または) を使用char[]
してにコピーする必要があります。使用する場合は、null terminate を覚えておく必要があります。memcpy()
strcpy()
strncpy()
name
newCat.name
memcpy()
newCat.name
うわぁ。関数から自動(スタックベース)変数を返しています。スタックフレームがポップされてメモリがなくなると、それは恐ろしく死にます。構造を動的に割り当て、データを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;
}
あなたのコードには 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;
}