uc_day02
来源:互联网 发布:centos 7.3 1611下载 编辑:程序博客网 时间:2024/05/14 23:43
一,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等等仅仅是让编译器看的
0 0
- uc_day02
- 2014 拒绝平庸
- POJ - 2229 Sumsets (动态规划)
- cocos2d-x 数学函数、常用宏整理(1)
- Clone Graph
- 嵌入式 gdb调试收集
- uc_day02
- HDU1203
- 图像分割算法简介(上)
- 【选择排序】直接选择排序--Java
- PAT (Advanced) 1025. PAT Ranking (25)
- 【求职】面试常见编程类题目---排序
- 史上最全计算机毕业设计题目1(10万套,大部分全国唯一)
- LCA算法实现方法介绍
- RBM训练指导手册粗略(A Practical Guide to Training Restricted Boltzmann Machines)