繁体   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