C/C++ 语言 零碎知识点的总结(1)

C/C++ 语言 零碎知识点的总结(1)

  在大学近三年的学习中,零零散散的遇到过较多的知识和问题,但时间过长之后也会有所遗忘,为了克服这个问题,想到可以用博客来做记录,方便模糊的时候回头再学习。

首先,看代码:
	# include <stdio.h>
		
		int main(void){
    
    
		
			char side_a[] = "Side A";
			char dont[] = {
    
     'w','o','w','!'};	
			char side_b[] = "Side B";
			
			puts(dont);
			return 0;
			
		}

在这里插入图片描述
  你是不是会对运行结果有点小惊讶呢,觉得使用 puts函数输出的不应该是dont中的 “wow!” 字符串么?为什么还会有Side A呢,又为什么不能是后面的Side B呢

  别担心,博主来为您解答。

  知识点1 :puts()函数解析:

  相信,此刻路过该博文的靓仔萌妹们,一定已经很熟悉puts()函数的正确使用了,不了解的话也没关系嘛,博主很细心的哈,已附上学习链接。

  1. puts()函数百度百科
  2. C语言puts()函数用法详解

  我们重回话题,没错,puts()函数最重要的一个点就是,puts函数是遇到结束符 “\0” 才会结束的,否则,计算机会在内存中向下寻找,直到遇到空字符才结束,所以,没有结束标志的话,puts函数可能会输出乱码来。

  知识点2 :C/C++ 各变量存储的区域不同。

  C/C++程序中各变量在内存中的存储区域:

  1. 内存栈区:存放局部变量名
  2. 内存堆区:存放new或malloc出来的对象;
  3. 常数区:存放局部变量或者全局变量的值;
  4. 静态区:用于存放全局变量或者静态变量;
  5. 代码区:二进制代码。

  此外,C/C++是没有垃圾回收机制的,因此,需及时的对堆数据进行销毁回收,以防止内存泄露,就是我们熟悉的free()和delete()函数啦,而栈内存是动态释放的。
  好了,可爱的你通过如上的简单介绍后,一定已经猜到该代码运行结果的原因了,哈哈哈,让我一同揭晓谜底。

在这里插入图片描述

  首先,申明的均是局部变量,所以均在内存栈中分配的空间。而dont数组中是没有字符串结束符 ‘\0’ 的,所以,在使用puts()函数后就会在内存栈中就近向后寻找包含结束符 '\0’的字符串,一并输出。
  又因side_a变量先于dont变量入栈,所以side_a位于dont之后,指针 p 向后查询到side_a时刚好有结束符 ‘\0’,所以puts()函数运行到side_a的时候也才算真正的结束。
  好了,博文也算断断续续的总结完了,今天也是除夕,就祝大家新春快乐,“牛”转乾坤吧!!

猜你喜欢

转载自blog.csdn.net/qq_43515862/article/details/113756677