基本上我有这个数据结构:
typedef struct Data {
char *str;
int n;
} TData, *AData;
我想在哪里使用malloc为str
分配空间(在该变量中我放了一个我从文件中读取的字符串,老实说,考虑到我的问题,它并不重要)。因此,我创建了一个函数TData InitData(const char *file_name)
:
TData InitData(const char *file_name) {
TData data;
data.str = malloc(1024);
if (!data.str) {
printf("Allocation error!\n");
// I have no idea what to return here in order to exit the function.
return (...);
}
return data;
}
现在,在我的主要()'功能,我会打这样的电话:
int main(int argc, const char * argv[]) {
TData data;
if(!(data = ReadExpression(argv[1]))) {
return 1;
}
// I do something with my data and the program ends.
return 0;
}
如何在InitData
函数中使return语句有效?
我知道另一种方式,可能推荐的方法是将TData data
从main
发送到InitData
作为类型AData
的参数并更改类型对int
的函数(会产生类似int InitData(const char *file_name, AData data)
)或仅使用AData
的函数。
答案 0 :(得分:3)
因此,在您的情况下,将函数重写为:
bool InitData (TData* data, const char *file_name);
其中bool可以用枚举替换,以获取更详细的错误代码。现在功能结果只是“ok”或“error”。
答案 1 :(得分:1)
C没有内置的多值返回,所以通常你要做的是
int InitData(const char *file_name, TData *returnedData) { ... }
InitData的返回值是错误/成功标志,并且通过指针返回TData
结构。
答案 2 :(得分:1)
我在C
中做的不多,但很多功能都是这样的:
int foo(intargs, outargs);
这背后的事情是你分配对象并将其作为引用传递给函数内部。
函数的返回值将是enum
或类似的东西进行比较以确定发生了什么。
答案 3 :(得分:1)
我喜欢MicroVirus建议的方式。接受数据作为参数也可用于多线程代码安全。此外,您可以返回操作结果以检入调用代码。你的TData不是一个指针,所以你不能把它设置为NULL,这是一种告诉我认为无效的情况的方法。但是,这里还有另一个问题! InitData中的TData数据是局部变量,应在函数返回时复制。我认为这不是一个很好的性能问题。我建议,接受对象作为参数(例如作为指针)将函数的结果返回给调用代码并检查数据的有效性。您可以设置数据是否为NULL,但是当您返回结果值时,这会使所有内容清除而不检查数据对象本身。
答案 4 :(得分:0)
正常返回data
,但请将main()
中的代码更改为:
data = ReadExpression(argv[1]);
if ( !data.str ) {
return 1;
}
你无法返回标量值来代替struct
,而你的问题表明你已经知道你可以使用指针而不是选择,所以这是最简单的替代方法。
答案 5 :(得分:0)
您可以在Data-struct集中拥有一个标志,具体取决于if (!data.str)
结果,并始终返回data
。
每当你想知道发生了什么时,请检查标志。
只是为了澄清: 你可以写这样的东西,或类似的东西:
`typedef struct Data
{
char *str;
int n;
char myflag;
const char *file_name;
} TData, *AData;`
`void InitData(TData *data)
{
data.str = malloc(1024);
if (!data.str)
{
printf("Allocation error!\n");
myflag=0;
}
else
{
myflag=1;
}
return data;
}`
但也请看评论。只想提出另一个观点。