返回返回void *的函数中的常规对象

时间:2014-08-25 03:39:28

标签: c pointers

当我这样做时,我的代码似乎运行正常,所以我只是想知道它是否允许或是否可能导致意外错误。我还在学习如何处理void*,因此我不能完全确定何时需要演员或(在这种情况下)需要返回的内容。

我有这样的事情:

struct x
{
   int i;
   char* s;
}

void* call_me(struct x* some_x)
{
   some_x->i = 5;
   some_x->s = "hello";

   return some_x;
}

我不确定这里会有什么替代方法(除了更改函数返回类型,但我需要将其保留为void*)。这种做法好吗?它编译并运行我的预期,但我不确定这是不是巧合。

为什么我不必返回void*的对象?

3 个答案:

答案 0 :(得分:1)

在C中,编译器可以隐式地将类型指针转换为void指针。这是完全有效的,虽然它可能不安全,因为再次使用指针,你将不得不将其转换为其他东西,编译器无法检查它的有效性。

答案 1 :(得分:1)

你在C中有保证......它很简单,但功能强大,你可以从任何数据指针类型转换为void *并再次自由返回...这是允许你做事的保证就像std C中的面向对象编程一样。

请参阅6.3.2.3

答案 2 :(得分:1)

Void *可用于指向任何类型的数据对象,这就是为什么您不必将指针“some_x”强制转换为void *。但是如果你想使用void *指针访问对象的值,你必须使用显式类型转换,同时取消引用void *指针,告诉编译器指向的对象的大小。

虽然,如果你在函数调用中传递一个指针,你实际上并不需要将它返回,原始副本将被函数更改,以后可以直接访问。