通过函数的返回值初始化C struct

时间:2016-11-27 23:14:34

标签: c structure

我正在尝试创建一个函数来初始化一个结构并将其传回给它的返回值,但我无法使它工作。我在哪里弄错了?我收到了分段错误错误。

#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;
}

1 个答案:

答案 0 :(得分:2)

  

我在哪里弄错了?

这是一行:

y.name = *name;

出于几个原因这是错误的。

  1. 您正在为char*name类型的变量分配char*y.name。它违反了指针赋值运算符的约束。

    来自C11标准:

      

    6.5.16.1简单分配

         

    <强>约束

         

    1以下之一应持有:

         

    ...

         

    - 左操作数具有原子,限定或非限定指针类型,并且(考虑左值操作数在左值转换后将具有的类型)两个操作数都是指向兼容类型的限定或非限定版本的指针,以及指向的类型左边有所有右边指向的限定词;

         

    - 左操作数具有原子,限定或非限定指针类型,并且(考虑左值操作数在左值转换后将具有的类型)一个操作数是指向对象类型的指针,另一个是指向限定的指针或void的非限定版本,左边指向的类型具有右边指向的所有类型的限定符;

         

    - 左操作数是原子,限定或非限定指针,右边是空指针常量;或

    该指配的RHS不满足上述任何约束条件。

  2. 当您将该值视为

    中的空终止字符串时
    printf("%s\n", x.name);
    

    你遇到了未定义的行为。

  3. 您可以通过调高编译器的警告级别来检测这样的错误。在使用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,则实施起来并不难。您也可以在网上轻松找到实施方案。