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