Void函数作为指针

时间:2014-04-15 06:50:42

标签: c++ pointers

这有什么区别:

void copydata(void *, void *, size_t);

和此:

void *copydata(void *, void *, size_t);

我必须在返回指针时使用指针函数,例如:

char *myName(int i)
{
  switch (i) { case 0: return "Jack"; break; default: return "Adam"; }
}

但是在“void * copydata”示例中,该函数不必返回任何内容,并且它以两种方式正确编译,并且在两种情况下生成的asm代码看起来都相同。

6 个答案:

答案 0 :(得分:3)

  

这有什么区别:

     

void copydata(void *, void *, size_t); // (1)

     

和此:

     

void *copydata(void *, void *, size_t); // (2)

(1)void函数。这意味着它不会返回任何东西。 (2)是一个返回指向void指针的函数,即void*。它必须返回一些东西。

  

但是在“void * copydata”例子中,该函数不必返回任何内容,

这是不正确的。它必须返回void*或可转换为1的内容。

  

并且它以两种方式正确编译,并且在两种情况下生成的asm代码看起来都是相同的。

不从非void函数返回未定义的行为。编译器没有产生错误,但结果代码不可信。

请参阅this related question

答案 1 :(得分:2)

第一个是void函数:它返回无值

第二个返回pointer to void返回一个指针

在发布的代码中,您将返回char文字的地址。如果您在代码期望指针时没有返回任何内容,那么您将获得未定义的行为,因为您甚至没有触及指针处的"返回结束& #34;调用和脏内存将会到位(或者在最好的情况下,如果它是全局的,则进行零初始化)。

此处有更多信息:https://stackoverflow.com/a/1610454/1938163

答案 2 :(得分:0)

第一个函数将不返回任何内容,而第二个函数将返回一个无效指针。

答案 3 :(得分:0)

void copydata(void *, void *, size_t);

这意味着该功能不会返回任何内容。在哪里,

void *copydata(void *, void *, size_t);

表示该函数返回一个指针。在第二种情况下,函数应返回指向任何事物的指针。

答案 4 :(得分:0)

如果返回类型为void *,则必须返回没有类型的指针,其中具有void返回类型的函数不需要返回任何内容。但是可以使用return;在函数内(最后不需要)有条件地返回控件。

答案 5 :(得分:0)

在内存分配方面: ' void * copydata()'表现与' int * copydata()'完全相同和' double copydata()'等等 这意味着将在堆栈上分配一些内存来存储函数的返回值(取决于编译器实现和优化)。如果你没有做返回结果;'记忆不会被正确初始化。我认为结果与尝试使用未初始化的变量相同。 虽然如果你不使用结果,它就不会破坏你的程序。