这有什么区别:
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代码看起来都相同。
答案 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
函数返回未定义的行为。编译器没有产生错误,但结果代码不可信。
答案 1 :(得分:2)
第一个是void
函数:它返回无值。
第二个返回pointer to void
:返回一个指针。
在发布的代码中,您将返回char文字的地址。如果您在代码期望指针时没有返回任何内容,那么您将获得未定义的行为,因为您甚至没有触及指针处的"返回结束& #34;调用和脏内存将会到位(或者在最好的情况下,如果它是全局的,则进行零初始化)。
答案 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()'等等 这意味着将在堆栈上分配一些内存来存储函数的返回值(取决于编译器实现和优化)。如果你没有做返回结果;'记忆不会被正确初始化。我认为结果与尝试使用未初始化的变量相同。 虽然如果你不使用结果,它就不会破坏你的程序。