你在用C++编程时遇到的最多的几个汉字是啥?

本文通过几个实验探讨了C++中未初始化的堆和栈内存通常包含的默认值,并解释了为何会出现特定的汉字字符。

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

首先,什么都不说,我们来看一段代码,然后试着编译运行:

#include <iostream>

#include <malloc.h>

#include <string>
using namespace std;

char* h = (char*)malloc(2*sizeof(char));
int main()
{
	string str;
	str.push_back(h[0]);
	str.push_back(h[1]);
	cout<<str<<endl;	
	system("pause");
	return 0;
}

运行结果截图:


问题一:为什么会出现“屯”?


下面,我们稍微改动一下,再来看看:

#include <iostream>

#include <malloc.h>

#include <string>
using namespace std;

int main()
{
	string str;
	char s[10];
	str.push_back(s[0]);
	str.push_back(s[1]);
	cout<<str<<endl;	
	system("pause");
	return 0;
}

运行结果截图:(注意:正常情况下编译时会出现以下情况,请点击continue)


生成结果:


问题二:

为什么会出现这个大家很熟悉的“烫”字?


在学习C++的时候,也许我们遇到的最多的两个汉字就是他们了(VC平台),有人可能会想,这是为什么?换句话说,对于上述二个问题,你有什么看法?下面请跟着我一步步的去探究这里面的原因:

首先对于问题一:

我们要清楚的一点是,这究竟是个例,还是普遍现象?我们再来验证一下:

#include <iostream>

#include <malloc.h>

#include <string>
using namespace std;

char* h1= (char*)malloc(2*sizeof(char));

char* h2= (char*)malloc(2*sizeof(char));

char* h3= (char*)malloc(10*sizeof(char));

char* h4= new char[2];

int main()
{
	string str;
	
	str.push_back(h1[0]);
	str.push_back(h1[1]);
	cout<<"h1: "<<str<<endl;	
	str.clear();
	str.push_back(h2[0]);
	str.push_back(h2[1]);
	cout<<"h2: "<<str<<endl;	
	str.clear();

	str.push_back(h3[0]);
	str.push_back(h3[1]);
	str.push_back(h3[2]);
	str.push_back(h3[3]);
	cout<<"h3: "<<str<<endl;	
	str.clear();

	str.push_back(h4[0]);
	str.push_back(h4[1]);

	cout<<"h4: "<<str<<endl;	
	system("pause");
	return 0;
}

结果如下:



          看到结果之后,我们基本可以肯定,这并不是一个个例,而是普遍存在的现象(VC平台)。我们都清楚,在C++中,一般分成栈区域(Stack),堆区域(Heap),代码区(Code Area),数据区(Data Area)(又分为自由存储区,全局/静态存储区,常亮存储区).此处,我们仅仅考虑堆区域,和栈区域和自由存储区。堆区域一般存放的是动态内存,供程序随机申请使用,但是内存的申请与释放必须程序员亲力亲为,常见的比如New出来的内存块。栈区域则存放程序需要的局部数据,这些数据可以动态的反应程序中对函数的调用状态,一般来说系统自动回收。自由存储区是那些由malloc等分配的内存块,跟堆有点相似。这些是C++程序员应该掌握的一些基本内容。接着来,

          一个汉字占两个字节,经过以上验证,我们至少可以肯定的说,堆(还有自由存储区)未初始化时的内容是最多以两个字节(都是汉字"屯"嘛,当然也更可能是以一个字节为单位,因为也可能存在GBK编码重复的嘛(真实情况就是这样啦!后面验证。。))为单位的信息(至于什么信息,后面再来验证)。

         为了弄清,这里的"屯"字究竟是什么,请转到我的其中一篇博文http://blog.youkuaiyun.com/liygcheng/article/details/11686117,然后在该页面按Ctrl + F, 查找"屯"字的GBK编码,是不是下面这个情况呢?


相信这个大家都能看得懂吧,显然,"屯"字的GBK编码为“CDCD",这是16进制,那么这不就是说,每个字符的GBK编码是CD么? 显然这是一个负数-51,于是我们就可以下结论了,堆空间(还有自由存储区)未初始化时的默认字符是-51。不过,至于为什么一定要是-51,这个估计就要问微软了。。

     至此,问题一基本上已经回答完毕,那么问题二是不是也很简单呢?

提示:在VC中,栈空间未初始化时的字符默认是-52,补码是0xCC.

补:在文章的结尾,我们再来做个有趣的事情,来证明我们上面的结论都是正确的,参见代码如下:

#include <iostream>
#include <string>
using namespace std;


char* h = new char[4];

int main()
{
	
	memset(h,-52,4);//以字节为单位批量填充,是不是就将原本该显示的"屯"换成了"烫"呢。。
	cout<<h<<endl;

	system("pause");
	return 0;
}



    


<think>首先,用户的问题是:“我想询问C++程序中多个文件下主函数的最大数量请问C++多个源文件中最多可以有几个main函数”系统级指令:-所有行内数学达式使用$...$格式。-独立公式使用 $$...$$格式并单独成段。 -LaTeX语法正确。-使用中文回答。-生成相关问题。 -回答中引用的段落末尾自然地添加引用标识,例如 [^1]。-回答结构清晰,帮助用户逐步解决问题,尽量保证回答真实可靠。 用户可见层: -回答结构清晰,逐步解决问题。-参考站内引用:有三个引用,但用户说“上述引用仅供参考,并不是用户真正的需求”,所以我不能直接依赖这些引用。用户真正的需求是关于C++多个源文件中main函数的数量。关键点:-在C++中,每个可执行程序只能有一个main函数,因为main是程序的入口点。 -如果多个源文件中有main函数,编译器会报错,除非这些文件不被同编译成一个可执行文件。 -用户提到“多个文件下主函数的最大数量”,意思是在多个源文件中,最多可以有几个main函数而不冲突。 从引用中提取相关信息: -引用[1]:提到在多个文件中,main函数可以重命名为main1,main2等,并通过修改CMakeLists.txt来分别编译运行。 -引用[2]:在CLion中,使用插件来允许每个源文件有自己的main函数,并独立运行。 -引用[3]:在VisualStudio中,通过排除文件从生成中来分别运行不同的main函数。 这些引用显示,技术上可以有多个main函数,但需要通过工具或配置来分别编译和运行每个文件,而不是同编译所有文件到一个可执行文件中。 核心答案:-在C++标准中,一个可执行程序只能有一个main函数。 -因此,在多个源文件中,如果你想要编译成一个可执行文件,只能有一个main函数。-但如果你有多个源文件,每个文件都有自己的main函数,你可以通过构建系统(如CMake、IDE设置)来分别编译每个文件为独立的可执行文件。-所以,“最多可以有几个”没有硬性限制,取决于你的构建配置。理论上,可以有任意多个源文件,每个都有一个main函数,但每个只能被单独编译成独立的可执行文件。回答结构: 1.解释C++标准:程序入口点必须是唯一的main函数。 2.讨论多个源文件的情况:如果所有文件都编译成一个可执行文件,只能有一个main函数;否则会链接错误。3.提供解决方案:如何允许每个源文件有自己的main函数并通过配置分别运行。 4.生成相关问题。 使用中文回答。 数学达式:用户问题中没有明显的数学,但如果有变量或概念,用$...$格式。例如,提到“main函数”,不需要数学格式。 引用标识:在回答中,如果引用段落,添加[^1]。但用户提供的引用是关于如何处理的,不是直接关于数量。所以,我可以参考这些来支持我的回答。最终答案: -最大数量:理论上无限,但每个可执行文件只能有一个main函数。通过配置,可以有多个源文件各有一个main函数,分别编译。相关问题生成: -类似于示例,生成3-5个相关问题。</think>### C++ 程序中多个源文件下主函数的最大数量 在 C++ 编程中,程序的入口点是 `main` 函数。根据 C++ 语言标准(如 C++11 及以上),一个可执行程序(例如一个 `.exe` 文件)只能有一个 `main` 函数作为入口点。这是因为链接器在生成最终可执行文件,需要唯一的起始地址[^1]。如果多个源文件同定义了 `main` 函数,并尝试编译成一个可执行文件,编译器会报错(如“multiple definition of `main`”)。 然而,在多个源文件中,您可以有多个 `main` 函数,前提是这些文件**不被同编译到同一个可执行文件中**。具体来说: - **理论最大数量**:没有硬性上限。您可以创建任意多个源文件(例如 `file1.cpp`, `file2.cpp`),每个文件都包含一个 `main` 函数,只要通过构建系统(如 CMake、Makefile 或 IDE 设置)分别将它们编译为独立的可执行文件。例如,有 $n$ 个源文件,就可以有 $n$ 个 `main` 函数,生成 $n$ 个独立的可执行程序。 - **实际限制**:这取决于构建工具和系统资源: - 在 CMake 中,您可以为每个源文件单独定义可执行目标(如引用[1]所述,通过重命名 `main` 函数或配置 `CMakeLists.txt`)。 - 在 IDE(如 CLion 或 Visual Studio)中,使用插件或排除机制(如引用[2]和[3])允许每个文件独立运行。 - 如果所有源文件被强制编译到一个可执行文件中,`main` 函数数量只能是 1,否则会导致链接错误。 #### 如何实现多个 `main` 函数共存 1. **重命名和单独编译**(推荐方法): - 将每个源文件的 `main` 函数重命名为唯一名称(如 `main1`, `main2`)。 - 在构建文件(如 `CMakeLists.txt`)中,为每个文件创建独立的目标: ```cmake add_executable(program1 file1.cpp) add_executable(program2 file2.cpp) ``` 这样,每个文件可独立编译运行,避免冲突[^1]。 2. **IDE 配置**: - 在 CLion 中:安装 C/C++ Single File Execution 插件,右键点击源文件选择 “Add executable”,然后单独运行[^2]。 - 在 Visual Studio 中:右键文件 → 属性 → 设置 “从生成中排除” 为 “是”,只保留当前要运行的文件[^3]。 3. **命令行编译**: 使用编译器命令分别编译每个文件: ```bash g++ -o program1 file1.cpp g++ -o program2 file2.cpp ``` #### 示例场景 假设有两个源文件: - `file1.cpp`: ```cpp int main1() { // 重命名避免冲突 return 0; } ``` - `file2.cpp`: ```cpp int main2() { // 重命名 return 0; } ``` 在 `CMakeLists.txt` 中配置: ```cmake add_executable(app1 file1.cpp) add_executable(app2 file2.cpp) ``` 这样,两个文件可共存,且每个都能生成独立可执行文件。 总之,C++ 多个源文件中最多可以有**任意多个 `main` 函数**,但必须通过构建配置将它们隔离为独立的可执行单元。如果直接编译到单一可执行文件,则只能有一个 `main` 函数[^1][^2][^3]。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值