簡體   English   中英

通過函數的返回值初始化C結構

[英]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;

有幾個原因是錯誤的。

  1. 要指定一個char*name ,以類型的變量char*y.name 它違反了指針的賦值運算符的約束。

    根據C11標准:

    6.5.16.1簡單分配

    約束

    1符合下列條件之一:

    ...

    —左操作數具有原子,合格或不合格的指針類型,並且(考慮到左操作數在左值轉換后將具有的類型),兩個操作數都是指向兼容類型的合格或不合格版本的指針,並且左側指向的類型具有右側所指類型的所有限定詞;

    —左操作數具有原子,限定或不限定的指針類型,並且(考慮到左操作數在左值轉換后將具有的類型),一個操作數是指向對象類型的指針,另一個是指向限定或不限定版本的指針。為void ,並且左側指向的類型具有右側指向的所有類型的限定符;

    —左操作數是原子,限定或不限定的指針,而右是空指針常量; 要么

    該分配的RHS不滿足上述任何約束。

  2. 當您將該值視為以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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM