C的return和空指针

C的return和空指针

写的很好的文章参考

void 和 void*
void 也是一种数据类型,可以称为空类型。void* 是一种指针类型,可以称之为任意类型的指针。对于定义一个函数来说,一定要定义参数类型和返回值类型,所以对于void和void*,会有这几种情况:

  • void func(void);
  • void func(void * arg);
  • void * func(void);
  • void * func(void * arg);

void func(void);
前面的void表示这个函数的返回值为空类型,也就是不需要返回值。第二个void表明函数不需要接收任何参数。所以这个函数的框架可以是这样的

/* 如果不需要返回值,则声明该函数具有void返回类型;否则,默认返回类型为int */
void func(void{
		return; /* return后面可以不跟任何数据,表示什么也不返回,此时return也可以省略*/
		        /* renturn还有退出该函数的作用,即中止当前函数的运行,返回到调用者。 */
}

如果函数定义中有一个空返回类型,则该函数内部(通常)将没有返回语句。

void func(void{
		.
		.
		.
}
void func(void * arg);

这个函数表示返回值类型为一个空类型,但是要接收一个指针类型的参数,void *表示什么类型的指针都可以,也就是任意类型的指针都可以对void *类型的指针的赋值。任何类型的指针都可以直接赋值给它,无需进行强制类型转换。

void *p1;
int *p2;
p1 = p2;

但是要将void *类型的指针赋值给其它类型的指针的时候,必须进行进行强制类型转换。

int *a;
void *p;
a = (float *)p;

void * func(void);
有时候函数需要返回一个指针类型的值,void * 表示不限定返回值的指针类型,返回值可以是一个任意类型的指针。但是当这个函数执行失败时,也需要返回一个指针,这个指针就是空指针NULL。

void * func(void{
		return NULL;// 若函数执行失败,则返回一个空指针。返回空指针表示出错。
}

注意:void * 不是空指针类型,它和空指针一点关系也没有。void * 表示任意类型的指针。

void * func(void * arg);

表示返回值是一个指针类型,需要一个指针作为参数。

宏NULL
NULL是一个被定义在C标准库<stddef.h>中的宏。

C库宏NULL是空指针常量的值。根据编译器供应商的不同,它可以定义为((void *0),00L#define NULL ((void *)0)
or
#define NULL ((char *)0)
or
#define NULL 0L
or
#define NULL 0

在定义一个指针变量的时候,如果没有确切的地址可以赋值,为指针变量赋一个NULL是一个良好的编程习惯,赋为NULL值的指针被称为空指针。

在大多数操作系统上,程序不允许访问地址为0的内存,因为该内存是操作系统保留的。然而,内存地址0有特别重要的意义,它表明该指针不指向一个可访问的内存位置。但按照惯例,如果指针包含空值(零值),则假定它不指向任何东西。

return的值
对于成功,约定为0;对于各种失败,约定为负。标准库惯例为0表示成功,-1表示错误。

int pthread_mutex_unlock(pthread_mutex_t *mutex) 
返回值
如果成功,则pthread_mutex_unlock()返回0。
如果失败,则pthread_mutex_unlock()返回-1

而errno表示错误码。

#include <pthread.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <unistd.h> 
  
pthread_t tid[2]; 
int counter; 
  
void* trythis(void* arg) 
{ 
    unsigned long i = 0; 
    counter += 1; 
    printf("\n Job %d has started\n", counter); 
  
    for (i = 0; i < (0xFFFFFFFF); i++) 
        ; 
    printf("\n Job %d has finished\n", counter); 
  
    return NULL; 
} 
  
int main(void) 
{ 
    int i = 0; 
    int error; 
  
    while (i < 2) { 
        error = pthread_create(&(tid[i]), NULL, &trythis, NULL); 
        if (error != 0) 
            printf("\nThread can't be created : [%s]", strerror(error)); 
        i++; 
    } 
  
    pthread_join(tid[0], NULL); 
    pthread_join(tid[1], NULL); 
  
    return 0; 
} 

return 0 与return 1 与return -1
参考 C++函式返回值介绍

  1. return 0
    第一个含义一般用在main( )函数结束时,按照程序开发的一般惯例,表示成功完成本函数。
    第二个含义表示假,一般用于bool函数返回值。在C++中也可以直接用int,返回值为0时为假。宏定义ERROR 与FLASE一般为0。
  2. return 1
    与return 0 的第二个含义相对应,表示真,正确。宏定义TRUE一般为1。
  3. return -1
    与return 0 的第一个含义相对应,表示返回一个bool值,一般用在子函数结尾。按照程序开发的一般惯例,表示该函数失败。
  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在C语言中,return语句用于从函数中返回一个值。NULL在C语言中是一个宏定义,表示一个空指针常量。当一个函数的返回类型是指针类型时,可以使用return NULL来表示返回一个空指针。这通常用于表示函数执行失败或没有找到所需的结果。例如,如果一个函数在执行过程中发生错误,可以使用return NULL来表示函数执行失败。在这种情况下,返回NULL可以作为一个标志,告诉调用函数发生了错误。需要注意的是,当使用一个指向NULL的指针时,如果尝试访问该指针指向的内容,会导致段错误。因此,在使用指向NULL的指针之前,应该先检查该指针是否为NULL,以避免出现错误。 #### 引用[.reference_title] - *1* [【C语言】函数返回 return ; return 1; return NULL; return 0; 区分](https://blog.csdn.net/feit2417/article/details/80985397)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [C语言指针之NULL](https://blog.csdn.net/weixin_34481217/article/details/125280282)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值