第七十一天学习记录:对陈正冲编著《C 语言深度解剖》中关于1、2、4,5章作者留下部分问题的学习

news/2025/2/16 1:11:07/

问:有如下代码。

static int j;void fun1(void)
{static int i = 0;i++;
}void fun2(void)
{j = 0;
j++;
}int main()
{int k = 0;for (k = 0; k<10; k++){fun1();fun2();}return 0;
}

i 和 j 的值分别是什么,为什么?
答:
在这份代码中,变量 i 和 j 分别是函数 fun1 和 fun2 的静态局部变量。静态局部变量在函数内部声明,但在整个程序生命周期内都存在,且只初始化一次(第一次进入函数时初始化)。

在 main 函数中,fun1 和 fun2 分别被调用了 10 次,这意味着变量 i 和变量 j 都被分别累加了 10 次。但是由于变量 i 是函数 fun1 的静态局部变量,所以它的值在每次 fun1 调用后都会被保留。因此,最终 i 的值是 10,而 j 是一个全局变量,每次 fun2 调用都会将其值重置为 0,所以最终 j 的值是 1。

问:在 switch case 语句中能否使用 continue 关键字?为什么?
答:
在C/C++中,可以使用continue关键字来终止当前循环中的迭代,并开始下一轮迭代。但是,在switch-case语句中,不能使用continue关键字。

原因是,在switch-case语句中,switch关键字后跟随一个表达式,这个表达式决定了程序流程的走向。case标签则是用来匹配表达式结果的值之一。当匹配成功时,程序会执行对应的分支,并直接跳转到switch语句的结束位置,而不是进入一个循环体内部。因此,在switch语句内部使用continue关键字是没有意义的,也是无效的。如果需要提前结束switch-case语句的执行,可以使用break关键字来实现。

需要注意的是,在含有循环语句的switch-case代码块中,仍可以使用continue来终止当前循环中的迭代,并开始下一次迭代。但是,这与switch-case语句本身并没有直接联系,而只是循环语句的一种使用方式。

问:return ;
这个语句有问题吗?如果没有问题,那返回的是什么?

答:
return ;语句在函数中表示空返回,即返回值为空,并且结束当前函数的执行。这个语句不会报错,是合法的语法。

当函数的返回类型为void时,可以使用return ;来显式地返回空值。如果没有写return语句或者return后面没有指定返回值,也默认会返回一个空值,即函数的返回值为void。

当函数的返回类型不是void时,直接使用return ;是不合法的,编译器会报错。此时必须提供与返回类型相符的返回值表达式,将其作为return语句的参数来进行返回。

问:case 语句后面是否可以是 const 修饰的只读变量呢?
答:
在C/C++的case语句中,case标签后可以是常量表达式,但不能是变量。常量表达式是指在编译时就可以计算出结果的表达式,可以由字面值、枚举常量、const 变量或者 constexpr 函数等构成。

常量变量是指定义时使用了关键字const修饰的变量,它们的值在定义后不可更改。但是,在case标签后不能使用常量变量作为标签值,因为常量变量只有在运行时才能获取其值,而case标签要求在编译时就可以确定其值。

如果需要在switch-case语句中使用变量作为标签值,可以使用default标签来代替,然后在switch语句内部使用if-else判断来实现相应的逻辑。
问:以下代码杂x86系统下输出为多少?

#include <stdio.h>
int main()
{int a[5] = { 1,2,3,4,5 };int *ptr1 = (int *)(&a + 1);int *ptr2 = (int *)((int)a + 1);printf("%x,%x", ptr1[-1], *ptr2);return 0;
}

答:5,20

问:sizeof(ColorVal)的值为多少?为什么?
答:
sizeof(ColorVal)的值为4,因为枚举类型在内存中占用的空间是与int类型相同的。在C/C++中,枚举类型本质上是int类型的一种特殊取值方式,它只是通过标识符来方便地指代一组整数值,并不会改变其实际的数据类型。

因此,在定义枚举变量时,编译器会将其所定义的枚举类型映射为一个整数(如在上述代码中,GREEN=1, RED=2, BLUE=3,等等),并在内存中按照int类型的存储方式分配所需的空间。在32位机器上,int类型占用4个字节的空间,因此枚举变量ColorVal所占据的空间也是4个字节。

问:看看下面的代码:

#include <stdio.h>int main()
{char a[5] = { 'A','B','C','D' };char(*p3)[5] = &a;char(*p4)[5] = a;printf("p3=%p,p4=%p,p3+1=%p,p4+1=%p\n", p3, p4, p3 + 1, p4 + 1);return 0;
}

上面对 p3 和 p4 的使用,哪个正确呢?p3+1 的值会是什么?p4+1 的值又会是什么?
答:
在这里插入图片描述
问:对 NULL 指针连续 free 多次会出错吗?为什么?如果让你来设计 free
函数,你会怎么处理这个问题?

答:
对 NULL 指针进行 free 是没有意义的,因为 free 会释放指向的动态分配内存,并将指针所指向的位置标记为未被分配状态。因此在调用 free 前需要对指针进行非空判断。

如果对一个已经被释放的指针再次进行 free ,就会发生 undefined behavior(未定义行为),包括程序崩溃,内存泄漏,程序运行出现不可预测的错误等情况,这是因为 free 函数只能释放一次动态分配的内存,多次释放同一块内存会破坏内存管理系统的数据结构。

为了避免这种问题的发生,我们可以在每次 free 后将指针赋值为 NULL,即:

int *p = (int *)malloc(sizeof(int));
if (p != NULL) { // do something free(p); p = NULL;   // 将指针赋 NULL
}

这样即使误操作多次 free,也不会造成实际上的内存重复释放。

另外,还可以采用一些静态分析工具或者内存检测工具提前捕获类似的问题,避免出现重复释放内存的情况。


http://www.ppmy.cn/news/344998.html

相关文章

IP地址定位原理

IP地址定位是一种通过IP地址来确定位置的技术&#xff0c;在互联网和移动网络的应用十分广泛。本文将介绍IP地址定位的原理和实现方式。 IP地址定位原理 IP地址是Internet Protocol&#xff08;简称IP&#xff09;的缩写&#xff0c;是互联网上的一个地址标识符用于识别连接到…

干洗店洗护软件,洗鞋店软件,洗鞋店小程序,

干洗店洗护软件&#xff0c;洗鞋店软件&#xff0c;洗鞋店小程序&#xff0c;水洗标打印标签打印&#xff0c;上门取送&#xff0c;拍照上传&#xff0c;多门店多网点&#xff0c;用户端&#xff0c;骑手端&#xff0c;门店端&#xff0c;网点端。具有以下非常强大的功能和优势…

轻松去除rar/zip密码

在生活中&#xff0c;常常会碰到无法打开RAR/ZIP压缩包的情况&#xff0c;这时候你是否会感到焦虑呢&#xff1f;别担心&#xff0c;最简单的解决办法就是百度搜索“密码帝官网”&#xff0c;然后点击“立即开始”&#xff0c;在用户中心上传文件即可找回RAR/ZIP压缩包的密码。…

IP-GUARD是否支持对打了水印的文档去除水印?

是否支持对打了水印的文档去除水印&#xff1f; 支持&#xff0c;从4.64.1005.0版本开始&#xff0c;支持对打了文档水印的文档做去水印的操作&#xff0c;但只是支持去除非图片类型的显式水印。支持右键文件去除、申请去除、自我备案去除三种方式。 例如&#xff1a; 对客户端…

日语五十音,电脑壁纸,手机壁纸自制纪念

在家没事&#xff0c;学学日语啦&#xff0c;希望自己能坚持下去哟哟&#xff01;&#xff01;

打印纸张尺寸换算_电脑打印纸规格全记录

原标题&#xff1a;电脑打印纸规格全记录 电脑打印纸有分241和381通用两种规格。这里的241和381指的是他的宽度&#xff0c;通常用的时候来分层&#xff0c;可以分1至6层&#xff0c;颜色有白红黄绿蓝白&#xff0c;对于它的白色&#xff0c;分显色和不显色两种。第一层一般是不…

计算机打印中 纸张不出来,打印机总是卡纸怎么办,打印机卡纸拿不出来怎么办...

作为计算机的输出设备之一,打印机在我们日常的生活工作和学习中都是非常常见的。 目前市面上打印机的种类也是非常的多,有喷墨式、激光式、静电式等好几种。 在我们现代办公室里打印机几乎随处可见,它已经成为我们日常工作中必不可缺的办公器具。 很多人在最初使用打印机时都…

媒体分类详解,企业做活动可以邀请哪些媒体?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 媒体分类可以根据不同的维度进行划分。以下是一些常见的媒体分类方式&#xff1a; 1. 传统媒体&#xff1a; - 报纸&#xff1a;报纸是最传统的媒体形式之一&#xff0c;以印刷纸质媒体为…