psv杀戮地带自动瞄准:段错误

来源:百度文库 编辑:中财网 时间:2024/05/01 11:10:06
段错误

 

---------------------------(一)-------------------------------------

编译时遇见了段错误,

很多时候新手都会发现段错误,其实都是内存分配错误引起的:

即用定义指针直接赋值的,那么char *p="aaa",其实和const char *p ="aaa";是一样的,都在常量区,处于静态存储区,是只读的,不可修改的,"aaa",是固定存放在.rdata段的。如果对该只读的进行操作,那么系统就会提示“段错误”!

注意:上面的p是指针,在堆栈中,指向“aaa”这个固定的rdata,  *p是const类型,固定的,在.rdata只读段,即"aaa"

1.如果使用char *p="aaa";那么指针p 和aaa字符都在系统的只读段,常量区,是不能修改的,readonly

    但是如果使用char p[]="aaa",那么就可以修改,在读写段

2.上述的其实也就是静态分配和动态分配的问题,如果定义 char *p;  //p是只读的,而 char p[];就不是只读,是可读写的.

然后char *p可以用p=malloc()来申请一块动态的内存,free(p),那么p的内容也是可以修改的

,然后用strcpy(p,"aaa");来拷贝进入。

 

导致段错误的常见编程有:
1。坏指针错误。例如在指针赋值之前就用它来引用内存;或向库函数传递一个坏指针;

2。改写错误.越过数组边界写入数据,在动态分配的内存两端之外写入数据;
p=malloc(4);p[-1]=0;
3.释放引起的错误.释放同一块内存两次,或释放一块未曾使用malloc分配的内存等等.

 

看下这个帖子:http://bbs.chinaunix.net/viewthread.php?tid=975562&extra=&page=1

http://iseeu.blog.51cto.com/178863/140610

使用举例:

我定义一个结构体:

struct Test_SS{

             char username[16];                 //

              char *hostname;                     //

              struct other *baby;

}TT;

如果要初始化,那么可以

strcpy(TT->username,""); //整个初始化                          千万不能直接出现TT->username="aaa";   错误指针头                                                                                            这么能够指向一串字符串

或者TT->username[0]='\0';给第一个字符初始化               

TT->baby=NULL;空指针

---------------------------(二)-------------------------------------

如果main函数要调用另外的一个包含指针的函数,例如

int Get(char * username,char *hostname,char* address,struct aaa * bbb);

那么main函数中调用该函数,不能直接使用

Get(0,0,0,0);这种来初始化,必须要

定义在main函数中

char p1[11]={0};

char P2[11]={0};

char P3[11]={0};

struct aaa jiegou={0};

然后调用Get(p1,p2,p3,jiegou);这样才行

不然运行程序就出现"段错误"

原因,因为Get本身的指针是指向任何有效的内存段,如果直接放值,那么系统是不允许的,保护内存的,因为不知道该从哪里找值。

指针必须指向有效的指针地址变量.

---------------------------(三)-------------------------------------

关于字符类的函数,strcpy...strncpy..strcat..以及memset..memcpy等引起的段错误:

例如main中定义一个指针,

        char *p;     然后如果使用strcpy(p,"aaaaa");

或是char pointer[10]="goodday";

       memcpy(p,pointer,sizeof pointer);来初始化它,都会引起段错误

 

原因是因为char *p..只是定义了一个空指针p,该指针指向所有有效的内存,是一个临时的不确定的地址,如果有内存保护机制的系统,编译没有问题,但是如linux下就会提示.运行“段错误”。

所以最好养成的习惯是:

1.。。经常使用的字符串用char p[];来定义,因为这个定义下的p是一个固定的门牌号。

2.。。而结构体的定义,也是一样,定义个固定的.......例如struct aaaa bbbbb;然后调用函数的时候,使用&bbbb来传送。

3.要使用到的结构体最好都先定义一下.,不然很容易出现段错误。但是千万不要用空指针类型来定义,

     如,struct *p;之类的。