【发布时间】:2014-05-21 11:34:57
【问题描述】:
基本上我有这个数据结构:
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;
}
现在,在我的“main()”函数中,我会这样调用:
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。
【问题讨论】:
-
return NULL;也许?就像 malloc 一样。当然,您需要将 data 设为指向*Tdata的指针。 -
不能工作,因为函数是
TData类型。为了返回“NULL”,它必须是void *或指针。 -
您自己定义结构的语义。那么,sentinel-value 是什么,还是没有?我猜
(TData){0, 0}。另外,考虑将您的结构定义为typedef struct data{size_t len;char data[]} data;,并始终将其分配在堆上。无论如何,在 typedef 后面隐藏指针的使用是危险的。 -
@Deduplicator 嗯,我明白你的意思,我认为这将是最好的解决方案。
-
我的示例结构最后使用了不完整的数组类型,因此字符串直接保存在其他结构成员之后。不知何故,必须保留必要的空间...搜索 struct hack(C99 之前)和不完整的类型以获取以后的标准。