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等等仅仅是让编译器看的









0 0
原创粉丝点击