您的位置:首页 > 其它

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等等仅仅是让编译器看的
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: