uc_day02
2014-03-02 16:19
337 查看
一,C语言中的错误处理
1,错误处理方式
error.c
#include<stdio.h>
max(int x, int y){
return x > y?x:y;
}
int main(){
int r = max(3,4);
printf("r=%d\n",r);
return 0;
}
要求:返回最大值,如果相等,返回错误信息
#include<stdio.h>
max(int x, int y,int* r){
if(x == y) return -1;
*r = x>y?x:y;
return 0;
}
int main(){
int r;
if(max(3,4,&r) == -1){
printf("函数调用错误\n");
return -1;
}
printf("r=%d\n",r);
return 0;
}
出错指针返回NULL,整数返回-1
C语言中如果返回值是void,有一个潜藏的含义,这个函数调用不会出错
输出参数的常用方法
2,错误处理
errno.c
#include<stdio.h>
#include<errno.h>
#include<string.h>
int main(){
FILE* file = fopen("etc/passwd","r");
if(file == NULL){
printf("错误原因:%d\n",errno);
printf("错误原因:%s\n",strerror(errno));
printf("ERROR:%m\n");
perror("错误");
return -1;
}
printf("文件打开成功\n");
return 0;
}
-------------------------------------------------
FILE* file2 = fopen("etc/passwd","w");
if(errno != 0){
perror("打开文件失败");
}
//不能用errno的值判断刚才的操作是否出错,只能是当有错误发生时,
用errno来获取错误的原因
二,环境表
env 是shell所拥有的环境变量,在内存中
env.c//程序中获取这个环境表
#include<stdio.h>
#include<string.h>
int main(){
extern char** environ;//声明全局变量
printf("environ=%p\n",viron);
char** p = envirson;
while(*p){
printf("%s\n",*p);
p++;
}
char value[100] = {};//将环境变量LANG的值保存在value中
p = envirson;
while(*p){
//拿一个环境变量,看看是否是LANG,如果是,将=号后面的值保存到value中
if(strncmp(*p,"LANG")==0){
strcpy(value,*p+5);
break;
}
p++;
}
printf("value=%s\n",value);
printf("===================\n");
return 0;
}
这张环境表是一个char** environ[]类型的数组
最后的元素是一个NULL
------------------------------------------------
#include<stdio.h>
#include<stdlib.h>
int main(int argc,char** argv, char** env){
extern char** environ;
printf("environ=%p\n",environ);
printf("env=%p\n",env);
char* value = getenv("LANG");
putenv("VAR=abc");
putenv("LANG=c");//修改或添加环境添加。不存在,添加,存在,修改
printf("value=%s\n",value);
return 0;
}
三,内存管理
1,STL ==> 内存自动的分配和释放
2,定位分配---C++
char buf[1024] = {};
int* p2 = new (buf)int;
*p2 = 200;
cout << *(int*)buf <<endl;
cout << *p2 << endl;
p2分配到了栈空间了 分配到了buf里面了
定位分配可以在栈空间,也可以在全局空间
不能再代码区分配空间
只有在堆空间分配需要delete
C++中的new/delete会调用构造和析构函数
3,C++ new/delete 会调用malloc和free
new.cpp
#include<iostream>
using namespace std;
class Sample{
int x;
Sample(){cout << "Sample()" << endl;}
~Sample(){cout << "~Sample()" << endl;}
void show(){cout <<"x=" << x << endl;}
};
int main(){
Sample* s = new Sample;
s->x = 100;
s->show();
delete s;
Sample* s2 = (Sample*)malloc(sizeof(Sample));
s2->x = 200;
s2->show();
free(s2);
Sample* s3 = new Sample[5];//构造和析构调用五次
delete[] s3;
Sample s5[5];//会构造五个对象出来,是在栈里面的分配的
//栈中是自动的分配和释放
return 0;
}
4,C语言中是malloc和free
5,unix规范 sbrk/brk
6,Linux分配 mmap
7,系统调用(内核) kmalloc vmalloc
get_free_page() 获取空闲的内存页面
四,进程空间
1,程序:在磁盘上保存的可以运行的文件
开始从PATH找,找到后读取到内存中
2,进程:正在运行的程序,存在内存中
memory.c
#include<stdio.h>
int main(){
int x = 100;
printf("x=%d\n",x);
return 0;
}
执行a.out的时候,先按照PATH从磁盘上找,找到后读到内存
代码读取到内存中存放的位置叫代码区(code)
代码区(code)
全局区
BSS段
栈区(stack)
堆区(heap)
3,一个进程空间被划分为一下部分:
1)代码区:要执行的程序被放入此区,只读区域
从08048000开始
2)全局区:保存全局变量,全局变量在main函数执行之前分配
3)BSS段:保存未初始化的全局变量,BSS段在main函数执行之前会被
清零。全局区和BSS段可称为全局区,静态区,数据区等
全局变量未被初始化是0,局部是垃圾数据,随机的
4)栈区:保存局部变量(包括函数参数),内存分配和释放自动进行的
栈中的变量也称为自动变量
5)堆区:也叫自由区,分配new,malloc分配出来的内存空间。
空间的分配和释放由程序员决定的。
ps -ef | grep a.out
cd /proc/4778
全局初始化的在全局区
全局未赋值的在BSS
全局常量在代码区
函数参数和局部变量在栈区
静态局部变量在全局区
局部常量在栈区
局部整形指针在堆区
局部字符指针在代码区
局部字符数组在栈中
char.c
#include<stdio.h>
#include<string.h>
int main(){
char* str1 = "abcdef";//str1四个字节,在栈里面,保存的内容在代码区中
str1[0] = 'A';//段错误,代码区是只读区域,不能更改的
printf("str1=%p\n",str1);
str1 = "ABCDEF";//正确,改变的是str1的值,改变的是栈,而不是代码区
char str2[] = "abcdef";
str2[0] = 'A';
return 0;
}
%s后面要的是地址
=======================================================
????????????????????
char* str1="abcdef";
printf("str1=%c\n",*str1);
=========================================================
stack.c
#include<stdio.h>
#include<string.h>
void fa(){
int x;//自动变量,在栈中分配的4Byes的空间
x = 100;
x = "abc";
printf("x=%s\n",x);
strcpy(&x,"abc");//正确
strcpy(&x,"abcdef");//错误
printf("x=%x\n",x);
printf("&x=%s\n",&x);
}
int main(){
fa();
return 0;
}
注:代码区只读,不能改
栈区的数据很特别,内存,存数据,类型,const等等仅仅是让编译器看的
1,错误处理方式
error.c
#include<stdio.h>
max(int x, int y){
return x > y?x:y;
}
int main(){
int r = max(3,4);
printf("r=%d\n",r);
return 0;
}
要求:返回最大值,如果相等,返回错误信息
#include<stdio.h>
max(int x, int y,int* r){
if(x == y) return -1;
*r = x>y?x:y;
return 0;
}
int main(){
int r;
if(max(3,4,&r) == -1){
printf("函数调用错误\n");
return -1;
}
printf("r=%d\n",r);
return 0;
}
出错指针返回NULL,整数返回-1
C语言中如果返回值是void,有一个潜藏的含义,这个函数调用不会出错
输出参数的常用方法
2,错误处理
errno.c
#include<stdio.h>
#include<errno.h>
#include<string.h>
int main(){
FILE* file = fopen("etc/passwd","r");
if(file == NULL){
printf("错误原因:%d\n",errno);
printf("错误原因:%s\n",strerror(errno));
printf("ERROR:%m\n");
perror("错误");
return -1;
}
printf("文件打开成功\n");
return 0;
}
-------------------------------------------------
FILE* file2 = fopen("etc/passwd","w");
if(errno != 0){
perror("打开文件失败");
}
//不能用errno的值判断刚才的操作是否出错,只能是当有错误发生时,
用errno来获取错误的原因
二,环境表
env 是shell所拥有的环境变量,在内存中
env.c//程序中获取这个环境表
#include<stdio.h>
#include<string.h>
int main(){
extern char** environ;//声明全局变量
printf("environ=%p\n",viron);
char** p = envirson;
while(*p){
printf("%s\n",*p);
p++;
}
char value[100] = {};//将环境变量LANG的值保存在value中
p = envirson;
while(*p){
//拿一个环境变量,看看是否是LANG,如果是,将=号后面的值保存到value中
if(strncmp(*p,"LANG")==0){
strcpy(value,*p+5);
break;
}
p++;
}
printf("value=%s\n",value);
printf("===================\n");
return 0;
}
这张环境表是一个char** environ[]类型的数组
最后的元素是一个NULL
------------------------------------------------
#include<stdio.h>
#include<stdlib.h>
int main(int argc,char** argv, char** env){
extern char** environ;
printf("environ=%p\n",environ);
printf("env=%p\n",env);
char* value = getenv("LANG");
putenv("VAR=abc");
putenv("LANG=c");//修改或添加环境添加。不存在,添加,存在,修改
printf("value=%s\n",value);
return 0;
}
三,内存管理
1,STL ==> 内存自动的分配和释放
2,定位分配---C++
char buf[1024] = {};
int* p2 = new (buf)int;
*p2 = 200;
cout << *(int*)buf <<endl;
cout << *p2 << endl;
p2分配到了栈空间了 分配到了buf里面了
定位分配可以在栈空间,也可以在全局空间
不能再代码区分配空间
只有在堆空间分配需要delete
C++中的new/delete会调用构造和析构函数
3,C++ new/delete 会调用malloc和free
new.cpp
#include<iostream>
using namespace std;
class Sample{
int x;
Sample(){cout << "Sample()" << endl;}
~Sample(){cout << "~Sample()" << endl;}
void show(){cout <<"x=" << x << endl;}
};
int main(){
Sample* s = new Sample;
s->x = 100;
s->show();
delete s;
Sample* s2 = (Sample*)malloc(sizeof(Sample));
s2->x = 200;
s2->show();
free(s2);
Sample* s3 = new Sample[5];//构造和析构调用五次
delete[] s3;
Sample s5[5];//会构造五个对象出来,是在栈里面的分配的
//栈中是自动的分配和释放
return 0;
}
4,C语言中是malloc和free
5,unix规范 sbrk/brk
6,Linux分配 mmap
7,系统调用(内核) kmalloc vmalloc
get_free_page() 获取空闲的内存页面
四,进程空间
1,程序:在磁盘上保存的可以运行的文件
开始从PATH找,找到后读取到内存中
2,进程:正在运行的程序,存在内存中
memory.c
#include<stdio.h>
int main(){
int x = 100;
printf("x=%d\n",x);
return 0;
}
执行a.out的时候,先按照PATH从磁盘上找,找到后读到内存
代码读取到内存中存放的位置叫代码区(code)
代码区(code)
全局区
BSS段
栈区(stack)
堆区(heap)
3,一个进程空间被划分为一下部分:
1)代码区:要执行的程序被放入此区,只读区域
从08048000开始
2)全局区:保存全局变量,全局变量在main函数执行之前分配
3)BSS段:保存未初始化的全局变量,BSS段在main函数执行之前会被
清零。全局区和BSS段可称为全局区,静态区,数据区等
全局变量未被初始化是0,局部是垃圾数据,随机的
4)栈区:保存局部变量(包括函数参数),内存分配和释放自动进行的
栈中的变量也称为自动变量
5)堆区:也叫自由区,分配new,malloc分配出来的内存空间。
空间的分配和释放由程序员决定的。
ps -ef | grep a.out
cd /proc/4778
全局初始化的在全局区
全局未赋值的在BSS
全局常量在代码区
函数参数和局部变量在栈区
静态局部变量在全局区
局部常量在栈区
局部整形指针在堆区
局部字符指针在代码区
局部字符数组在栈中
char.c
#include<stdio.h>
#include<string.h>
int main(){
char* str1 = "abcdef";//str1四个字节,在栈里面,保存的内容在代码区中
str1[0] = 'A';//段错误,代码区是只读区域,不能更改的
printf("str1=%p\n",str1);
str1 = "ABCDEF";//正确,改变的是str1的值,改变的是栈,而不是代码区
char str2[] = "abcdef";
str2[0] = 'A';
return 0;
}
%s后面要的是地址
=======================================================
????????????????????
char* str1="abcdef";
printf("str1=%c\n",*str1);
=========================================================
stack.c
#include<stdio.h>
#include<string.h>
void fa(){
int x;//自动变量,在栈中分配的4Byes的空间
x = 100;
x = "abc";
printf("x=%s\n",x);
strcpy(&x,"abc");//正确
strcpy(&x,"abcdef");//错误
printf("x=%x\n",x);
printf("&x=%s\n",&x);
}
int main(){
fa();
return 0;
}
注:代码区只读,不能改
栈区的数据很特别,内存,存数据,类型,const等等仅仅是让编译器看的
相关文章推荐
- day02-UC-静态库
- javaweb-day02-2(XML 解析 - Jaxp的sax方式解析)
- Firefox标签页工具~整合defpt的TabPlus.uc.js,并增加了几项常用功能!去掉地址栏输入新开功能~这是BUG,经常导致地址栏不能导航
- 在UC脚本中不能调用AS3.0中定义的函数的方法
- proc_day02
- UC:我们是怎么做出Chromium M35内核浏览器
- UC/OS-II在ARM微处理器上的移植及编译
- uc/os-ii消息队列
- day02--常用算法--查找
- eclipse 无用代码扫描工具UCDetector
- 嵌入式uC/OS-2的任务管理
- 马哥2013年运维视频笔记 day02 Linux系统常识
- UC/OS II事件管理(1)
- 使用uc/os开发要明确的几个堆栈
- uc笔记04---文件系统,文件常用命令(软/硬链接),文件描述符
- MVC学习Day02之校验
- 红黑树视频 http://gauss.ececs.uc.edu/RedBlack/redblack.html
- UC/OS基础知识之任务堆栈
- Android开发之浏览器用法实例详解(调用uc,opera,qq浏览器访问网页)
- Android Day02 --java基础