c语言中的函数头

c语言中的函数头,c,return,C,Return,假设我有以下功能: void *mycalloc(size_t num, size_t size, char *file, unsigned int line){ char *retptr = mymalloc((num * size), file, line); if(!retptr){ return NULL; } else{ header *blk_header = (header *)retptr - 1;

假设我有以下功能:

void *mycalloc(size_t num, size_t size, char *file, unsigned int line){
    char *retptr = mymalloc((num * size), file, line); 
    if(!retptr){
        return NULL;
    }
    else{
        header *blk_header = (header *)retptr - 1;
        for(int i=0; i<blk_header->size; i++){
            retptr[i] = 0;
        }
        return retptr; //<-- at this point
    }
}
void*mycalloc(size\t num,size\t size,char*文件,无符号整数行){
char*retptr=mymalloc((num*size),文件,行);
如果(!retptr){
返回NULL;
}
否则{
页眉*blk_页眉=(页眉*)retptr-1;
for(int i=0;isize;i++){
retptr[i]=0;
}

return retptr;//强制转换将从更“特定”的类型(
char*
)转换为更“通用”的类型(
void*
)。 这非常类似于从返回双精度
的函数返回
int
。执行隐式强制转换不会影响调用方


但是,如果
char*
是函数需要返回的唯一数据类型,则将返回类型设置为
char*
,则转换将从更“特定”的类型(
char*
)转换为更“通用”的类型(
void*
)。 这非常类似于从返回双精度
的函数返回
int
。执行隐式强制转换不会影响调用方


但是,如果
char*
是函数需要返回的唯一数据类型,则将返回类型设置为
char*
,则转换将从更“特定”的类型(
char*
)转换为更“通用”的类型(
void*
)。 这非常类似于从返回双精度
的函数返回
int
。执行隐式强制转换不会影响调用方


但是,如果
char*
是函数需要返回的唯一数据类型,则将返回类型设置为
char*
,则转换将从更“特定”的类型(
char*
)转换为更“通用”的类型(
void*
)。 这非常类似于从返回双精度
的函数返回
int
。执行隐式强制转换不会影响调用方

但是,如果函数需要返回的数据类型只有
char*
,则将返回类型设置为
char*

返回时将retptr强制转换为void*是多余的还是函数头决定返回的类型

是的。转换将自动进行


<> P>为了更清楚地了解这个主题,你可以考虑这个例子,它使用数字数据直观的原因:

#include <stdio.h>

int get_pi() {
  double pi = 3.14;
  return pi;
}


int main(void) {

  double pi = get_pi();
  printf("%f\n", pi);

  return 0;
}
该示例来自,您也可以在其中找到参考

返回时将retptr强制转换为void*是多余的还是函数头决定返回的类型

是的。转换将自动进行


<> P>为了更清楚地了解这个主题,你可以考虑这个例子,它使用数字数据直观的原因:

#include <stdio.h>

int get_pi() {
  double pi = 3.14;
  return pi;
}


int main(void) {

  double pi = get_pi();
  printf("%f\n", pi);

  return 0;
}
该示例来自,您也可以在其中找到参考

返回时将retptr强制转换为void*是多余的还是函数头决定返回的类型

是的。转换将自动进行


<> P>为了更清楚地了解这个主题,你可以考虑这个例子,它使用数字数据直观的原因:

#include <stdio.h>

int get_pi() {
  double pi = 3.14;
  return pi;
}


int main(void) {

  double pi = get_pi();
  printf("%f\n", pi);

  return 0;
}
该示例来自,您也可以在其中找到参考

返回时将retptr强制转换为void*是多余的还是函数头决定返回的类型

是的。转换将自动进行


<> P>为了更清楚地了解这个主题,你可以考虑这个例子,它使用数字数据直观的原因:

#include <stdio.h>

int get_pi() {
  double pi = 3.14;
  return pi;
}


int main(void) {

  double pi = get_pi();
  printf("%f\n", pi);

  return 0;
}


这个例子来自于你也可以找到引用。< /P>是的,它是多余的,因为 Value*/Cux>可以隐式地转换到任何非限定的对象指针类型。它也会降低可读性,所以它实际上是有害的。而且,你可以考虑使用<代码> MyStuts<代码>来代替M。emory。它更有可能被优化,而且您不必担心不同的指针类型。C中的

void*
在适当的时候会隐式转换为任何指针类型。这就是为什么您不强制转换
malloc
@cHao的返回值,这非常有趣,从未听说过it@TheParamagneticCroissant:哇,我很高兴在使用C的10年之后,我不知道。好的事情我从来没有觉得有必要尝试它……是的,它是多余的,因为<代码> Value*/Cord>可以隐式地转换到任何非限定的对象指针类型。它也会降低可读性,所以它实际上是有害的。而且,你可以考虑。使用
memset
而不是将内存归零。它更有可能被优化,并且您不必担心不同的指针类型。C中的
void*
将在适当的时候隐式转换为任何指针类型。这就是为什么您不强制转换
malloc
@cHao的返回值的原因。这真的很有趣,尽管如此r听说了it@TheParamagneticCroissant:哇,我必须查一下。使用C大约10年后,我不知道这一点。幸好我从未觉得有必要尝试它……是的,它是多余的,因为
void*
可以隐式转换为任何非限定对象指针类型。这也会降低可读性,因此你可能会考虑使用<代码> MyStuts<代码>来代替内存。它更可能被优化,而不必担心不同的指针类型。C中的<代码>空洞*>代码将在适当的时候隐式地转换为任何指针类型。这就是为什么你不返回“COD”的返回值的原因。e> malloc
@cHao那真有趣,从没听说过it@TheParamagneticCroissant:哇,我必须查一下。使用C大约10年后,我不知道这一点。幸好我从未觉得有必要尝试它……是的,它是多余的,因为
void*
可以隐式地与任何非限定对象进行转换