文档章节

C/C++程序运行流程(main函数前后做了什么?)

乌合之众
 乌合之众
发布于 2015/06/11 12:47
字数 890
阅读 27
收藏 0
点赞 0
评论 0

#C/C++程序运行流程(main函数前后做了什么?)

[TOC]

本文由乌合之众 lym瞎编,欢迎转载 my.oschina.net/oloroso

##原由

今天有人问一个c程序编译出错的问题,代码太长,就不贴了。大概是这样子的。

#include <stdio.h>
#include <string.h>

char buf[100];
strcpy(buf,"hello world");


int mian()
{
	printf(buf);
	return 0;
}

他的代码中的操作也类似,就是对一个全局数据进行了一次strcpy初始化,但是编译报错了。

##错误原因

其实这个错误是很简单的,只要弄清楚C程序的运行流程就可以了。 这里的strcpy被谁调用了呢?显然是没有的。因为C程序的入口点是main函数,如果把初始化过程放在main函数里面就没问题了。

这里出现的问题是没搞清楚声明或定义执行操作的语句的区别。

声明或定义是可以全局的但是执行某些操作的语句只能在某个函数内进行

来一个更简单的例子,这样可能会更明白。

#include <stdio.h>

int a;
a=3;

int mian()
{
	printf("a=%d\n",a);
	return 0;
}

现在编译一下,看看效果

gcc a.c 
a.c:8:1: warning: data definition has no type or storage class
 a=3;
 ^

虽然没有报错,但是有一个警告警告:数据定义没有类型或存储类。这说明了这里的两个a就不是同一个。 编译器把第一个int a;a=3看做了一个声明和一个定义,如果把a=3放入到main函数中,警告就会消失。

这里还不够明显,稍加修改一下,再看就更明显了

#include <stdio.h>
#include <string.h>

int a;
b=5;
int main()
{
	printf("a = %d   b = %d\n",a,b);
	return 0;
}

编译运行一下,看这次的报错就明白了吧。

o@o-pc:~/test$ gcc a.c
a.c:8:1: warning: data definition has no type or storage class
 b=5;
 ^
o@o-pc:~/test$ ./a.out 
a = 0   b = 5

本文由乌合之众 lym瞎编,欢迎转载 my.oschina.net/oloroso

##说说C/C++程序的运行流程

这里只是简单的说一下。 1、全局变量/对象的构建,初始化。对于全局变量,没有给定初始化值的,初始化为0。对于全局对象,没有指定构造函数的,调用默认构造函数。 2、进入main函数

  • main函数中的语句执行,函数调用 3、退出main函数 4、全局变量对象的回收。

我们可以写一个程序来验证一下,看看这个程序的输出结果与上面说的是否一致。

#include <stdio.h>

class A{
	public:
	A(){puts("默认构造");};
	A(int a){printf("带参构造 %d\n",a);};
	~A(){puts("析构");}
};

A a1;
A a2(2);
int c;
int d=5;

int main()
{
	printf("c = %d, d = %d\n",c,d);
	return 0;
        puts("sssssss");
}

编译运行

zo@o-pc:~/test$ g++ a.cpp
o@o-pc:~/test$ ./a.out 
默认构造
带参构造 2
c = 0, d = 5
析构
析构
o@o-pc:~/test$ 

可以看出,程序的运行结果与前面所说一致。 先是全局变量/对象的构建,默认初始化值和构造函数调用都正确了。 然后是main函数的调用。 最后是在main函数结束后再去调用全局对象的析构。(因为没有输出ssssssss,所以说明returnmain函数就结束(退栈)了,任何函数return了,就是该函数的调用结束了) 看来确实如此了。

© 著作权归作者所有

共有 人打赏支持
乌合之众
粉丝 13
博文 90
码字总数 79369
作品 2
海淀
程序员
main() and return

说到return,有必要提及主函数的定义。很多人甚至市面上的一些书籍,都使用了void main( )这一形式 ,其实这是错误的。 C/C++ 中从来没有定义过void main( ) 。C++ 之父 Bjarne Stroustrup 在...

丛灵始
2012/07/31
0
0
C语言/C++编程零基础入门到进阶知识学习

C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到...

小辰带你看世界
04/01
0
0
android开发教程(3)— jni编程之采用SWIG从Java调用C/C++

Android 从Java调用C/C++ 当无法用 Java 语言编写整个应用程序时,JNI 允许您调用C/C++本机代码。在下列典型情况下,您可能决定使用本机代码: 希望用更低级、更快的编程语言C/C++去实现对时...

刘小米
2014/09/16
0
0
C++十种方法"Hello World"

初学编程,无论是VB,C/C++,Java,C#大多都是从Hellow World这个程序开 始的,也是最常见的入门方法。C/C++本身有很多特性和用发,这里就用十种方法 实现Hellow World这个程序. 1. 最经典的...

程序鸡
2012/12/07
0
3
C到C++ 快速过度 A C++基本框架

单从语法上讲,C++继承了C中几乎所有的关键字,因此在C++中使用C语言完全没有问题。 需要注意的是,printf() 和 scanf() 是库函数,他们并不是C语言的一部分。比如,你不包含头文件stdio.h的...

傅芃芃
2015/01/19
0
0
C语言/C++编程学习:程序结构:构思

C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到...

小辰带你看世界
05/11
0
0
c语言主函数为什么要return

本文来源于网络 说到return,有必要提及主函数的定义。很多人甚至市面上的一些书籍,都使用了void main( )这一形式 ,其实这是错误的。 C/C++ 中从来没有定义过void main( ) 。C++ 之父 Bjar...

Baby_LoVe
2014/11/13
0
5
C,C++,VC++,MFC之间有什么区别和联系

转载:http://blog.163.com/jackiehowe/blog/static/199491347201242011203225/ C语言是一种古老而又经久不衰的计算机程序设计语言,大约诞生于上个世纪60年代。由于它的设计有很多优点,多年...

80后小子
2015/07/03
0
0
C编程学习:C程序解析:C语言代码中的每一行都是什么意思?

C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到...

小辰带你看世界
05/26
0
0
4-C++远征之起航篇-学习笔记

c++教程起航篇 我们会讲C++那些事,C++与C语言的关系。 C++诞生于贝尔实验室。 C++之父: 本贾尼·斯特劳斯特卢普 C++社区排行榜 最新排行,c++排名第三,Python排名第四 C++语言的应用领域:...

天涯明月笙
昨天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JAVA知识点随心记

1.Switch case具体的支持类型? Q:支持byte、short、char、int基本类型,枚举类型和String类型(JDK7以上支持),四种基本类型的包装类型也支持,但是原因在于触发了自动拆箱,将包装类型拆成了基本...

勤奋的蚂蚁
10分钟前
0
0
NoSQL

一、NoSQL介绍 NoSQL属于非关系型数据,mysql属于关系型数据库。 对于关系型数据库来说,是需要把数据存储到库、表、行、字段里,查询的时候根据条件一行一行地去匹配,当数据量非常大的时候...

人在艹木中
15分钟前
0
0
第17章MySQL主从配置

mysql安装总结 mysql主从准备工作: 准备两台机器,每台机器安装msyql服务,并启动mysql服务 mysql详细安装 1.首先下载二进制免编译的包,下载到/usr/local/src/目录下 2.解压压缩包 3.解压完...

Linux学习笔记
18分钟前
0
0
Redis高可用及分片集群

一、主从复制 使用异步复制 一个服务器可以有多个从服务器 从服务器也可以有自己的从服务器 复制功能不会阻塞主服务器 可以通过服务功能来上主服务器免于持久化操作,由从服务器去执行持久化...

Java大蜗牛
22分钟前
0
0
前端面试题汇总

最近在复习,准备找工作了,特此总结一下前端的相关知识。 1.获取浏览器URL中查询字符的参数: function getQuery(name){    var reg = new RegExp("(^|&)"+name+"=([^&]*)"(&|$));...

凛冬来袭
56分钟前
0
0
可持续发展的学习道路

与其要求别人,不如提升自己 内心渴望进步 经常做出改变现有模式,不断学习 寻找资源,整合资源,不断熟练这种模式 渠道很重要 先打开新世界的航路

狮子狗
今天
0
0
apollox-lua开源项目 示例codepen2

今天在示例上增加了几个功能, 首先添加js array的标准库。 所有js array的方法目前都支持了。 添加查看code模式。 点击查看code可以看到生成的lua代码。默认web模式需要把标准库连接进来, ...

钟元OSS
今天
0
0
javascript性能优化之避免重复工作

javascript最重要也最根本的性能优化标准之一是避免工作,避免工作又包括两点,第一,不做不必要的工作,第二,不做重复的已经完成的工作。第一部分可以通过代码重构完成,第二部分不做重复的...

老韭菜
今天
0
0
缓存穿透、并发和雪崩那些事

0 题记 缓存穿透、缓存并发和缓存雪崩是常见的由于并发量大而导致的缓存问题,本文讲解其产生原因和解决方案。 缓存穿透通常是由恶意攻击或者无意造成的;缓存并发是由设计不足造成的;缓存雪...

Java填坑之路
今天
1
0
项目jar包管理构建工具---Maven

一、what is Maven? 我们来寻找一下官网,里面介绍了maven到底是什么?下面一句话就有讲解到:Apache Maven is a software project management and comprehension tool. Based on the conc...

一看就喷亏的小猿
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部