文档章节

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

乌合之众
 乌合之众
发布于 2015/06/11 12:47
字数 890
阅读 71
收藏 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语言return函数

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

晨曦之光
2012/03/09
182
0
C语言/C++编程零基础入门到进阶知识学习

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

小辰带你看世界
2018/04/01
0
0
一篇C/C++自测试题(不是很难, 附解答)

编辑自一本叫《高质量C/C++编程指南》的书,虽然这些题有错误,而且不大严谨,但我觉得也能一定程度上测试C/C++水平. 我对题目和答案做了非常大幅度的修改,虽然仍存在已知的不严谨之处,但比...

王子亭
2013/01/12
1K
2
c语言主函数为什么要return

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

Baby_LoVe
2014/11/13
0
5

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周三乱弹 —— 风扇写着先生请自爱

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @蚂蚁哈哈哈 :分享陈奕迅的单曲《落花流水》 《落花流水》- 陈奕迅 手机党少年们想听歌,请使劲儿戳(这里) @车谷 :我发现每天上班都好困 ...

小小编辑
今天
31
5
centos7重置密码、单用户模式、救援模式、ls命令、chmod命令

在工作当中如果我们错误的配置了文件使服务器不能正常启动或者忘记密码不能登录系统,如何解决这些问题呢?重装系统是可以实现的,但是往往不能轻易重装系统的,下面用忘记密码作为例子讲解如...

李超小牛子
今天
3
0
Python如何开发桌面应用程序?Python基础教程,第十三讲,图形界面

当使用桌面应用程序的时候,有没有那么一瞬间,想学习一下桌面应用程序开发?行业内专业的桌面应用程序开发一般是C++,C#来做,Java开发的也有,但是比较少。本节课会介绍Python的GUI(图形用...

程序员补给栈
今天
9
0
kafka在的使用

一、基本概念 介绍 Kafka是一个分布式的、可分区的、可复制的消息系统。它提供了普通消息系统的功能,但具有自己独特的设计。 这个独特的设计是什么样的呢? 首先让我们看几个基本的消息系统...

狼王黄师傅
今天
3
0
Android JNI总结

0x01 JNI介绍 JNI是Java Native Interface的缩写,JNI不是Android专有的东西,它是从Java继承而来,但是在Android中,JNI的作用和重要性大大增强。 JNI在Android中起着连接Java和C/C++层的作...

天王盖地虎626
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部