文档章节

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

乌合之众
 乌合之众
发布于 2015/06/11 12:47
字数 890
阅读 37
收藏 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++编程学习:程序结构:构思

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

小辰带你看世界
05/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Sql语言与MySql数据库

1. 数据库简介 1. 数据库,就是存储数据的仓库,只能通过sql语言来访问,数据库也是一个文件系统。通常,MySQL、Oracle等数据库,也被称为关系型数据库,其保存的不仅仅只是数据,还包括数据...

江左煤郎
16分钟前
0
0
IDEA 取消自动import .*

打开设置 > Editor > Code Style > Java > Scheme Default > Imports ① 将 Class count to use import with "*" 改为 99 (导入同一个包的类超过这个数值自动变为 * ) ② 将 Names count ......

乔老哥
18分钟前
1
0
PostGIS学习笔记(开篇)

PostGIS事实上算是笔者开始写博客的第一篇内容。而事实上那篇博文的内容并不丰富,笔者对PostGIS的了解仍然不多,然而17年在OSGeo课程学习时对PostGIS又有了进一步了解,并逐步发现它的强大。...

胖胖雕
18分钟前
1
0
【Centos】在nginx服务器中配置php和mysql

接上一章《【Centos】利用Vultr服务器和namesilo布网》(https://my.oschina.net/u/3776619/blog/2051986),在Centos中配置好nginx,并在iptables中开启了80端口,和为了远程mysql操作方便开...

yongh701
41分钟前
2
0
flume -- fileChannel简要分析其过程

flume之event写入FileChannel doPut(event)-->获取共享锁后[log.lockShared();]-->FlumeEventPointer ptr = log.put(transactionID, event); 此处的log.put即将transactionID及event进行后续......

-九天-
53分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部