08_goto和void分析

本文详细分析了goto语句的副作用及其对程序结构的影响,并对比了void在函数声明中的使用,包括func(void)与func()的区别,以及void修饰指针的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

goto和void分析

1、goto关键字副作用分析

goto语句会破坏程序的结构
程序示例:

#include <stdio.h>
#include <malloc.h>

void func(int n)
{
    int* p = NULL;

    if( n < 0 )
    {
        goto STATUS;
    }


    p = (int*)malloc(sizeof(int) * n);

STATUS:
    p[0] = n;    

    free(p);
}

int main()
{  
    printf("begin...\n");

    printf("func(1)\n");

    func(1);

    printf("func(-1)\n");

    func(-1);

    printf("end...\n");

    return 0;
}

输出结果为:
在这里插入图片描述

2、void的意义

(1)func(void)和func()的区别

#include <stdio.h>

void func()
{

}

int main(void)
{

    func(1,2,3);

    return 0;
}

能够编译通过,func()代表能够传递任意参数,而func(void)代表不能传递参数;

(2)void主要用来修饰函数返回值和参数的,不可以修饰变量,但可以修饰指针;

#include <stdio.h>

int main(void)
{

    void var;
    void array[10];
    void* p = NULL;

    return 0;
}

输出结果为:
在这里插入图片描述
只有两个错误,证明void可以修饰指针;

(3)void类型大小是多少?

  • ANSI C:标准C语言规范
  • 扩展C:在ANSI C的基础上进行了扩充
#include <stdio.h>

int main(void)
{

    printf("sizeof(void) == %d\n",sizeof(void));

    return 0;
}

在gcc编译器上输出结果为:
在这里插入图片描述
在这里插入图片描述
(4)void指针的意义
在这里插入图片描述
实例分析:
memset函数的实现

#include <stdio.h>

void MemSet(void* src, int length, unsigned char n)
{
    unsigned char* p = (unsigned char*)src;

    int i = 0;

    for(i=0; i<length; i++)
    {
        p[i] = n;
    }
}

int main(void)
{
    int a[5] = {1,2,3,4,5};
    int i = 0;

    MemSet(a, sizeof(a), 0);

    for(i=0; i<5; i++)
    {
        printf("%d\n", a[i]);
    }

    return 0;
}

输出结果为:
在这里插入图片描述

3、小结

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值