[英]Initialize C struct by return value of a function
我正在嘗試創建一個函數來初始化結構並將其傳回其返回值,但是我無法使其正常工作。 我在哪里弄錯了? 我收到一個細分錯誤錯誤。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
int id;
char *name;
} Object;
Object object_ctor(int id, char *name);
int main()
{
Object x;
x = object_ctor(1, "Alex");
printf("%s\n", x.name);
return 0;
}
Object object_ctor(int id, char *name)
{
Object y;
y.id = id;
y.name = *name;
return y;
}
我在哪里弄錯了?
這是一行:
y.name = *name;
有幾個原因是錯誤的。
要指定一個char
, *name
,以類型的變量char*
, y.name
。 它違反了指針的賦值運算符的約束。
根據C11標准:
6.5.16.1簡單分配
約束
1符合下列條件之一:
...
—左操作數具有原子,合格或不合格的指針類型,並且(考慮到左操作數在左值轉換后將具有的類型),兩個操作數都是指向兼容類型的合格或不合格版本的指針,並且左側指向的類型具有右側所指類型的所有限定詞;
—左操作數具有原子,限定或不限定的指針類型,並且(考慮到左操作數在左值轉換后將具有的類型),一個操作數是指向對象類型的指針,另一個是指向限定或不限定版本的指針。為
void
,並且左側指向的類型具有右側指向的所有類型的限定符;—左操作數是原子,限定或不限定的指針,而右是空指針常量; 要么
該分配的RHS不滿足上述任何約束。
當您將該值視為以null結尾的字符串時,
printf("%s\\n", x.name);
您會遇到未定義的行為。
您可以通過提高編譯器的警告級別來檢測此類錯誤。 使用gcc -Wall
編譯時,我得到以下警告。
soc.c: In function ‘object_ctor’:
soc.c:26:12: warning: assignment makes pointer from integer without a cast [-Wint-conversion]
y.name = *name;
^
您需要使用類似:
y.name = strdup(name);
如果strdup
在您的平台上不可用,則實現起來並不難。 您也可以在網絡上輕松找到實現。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.