段錯誤怎麼解決?

General 更新 2024-11-19

如何處理c語言中的段錯誤信息

一般情況有兩種,越界和錯誤操作地址和數據。前者查看定義處的變量大小與調用出是否一致,後者查看是否忘記取地址符。

段錯誤的段錯誤的常見形式

在編程中以下幾類做法容易導致段錯誤,基本上是錯誤地使用指針引起的。1)訪問系統數據區,尤其是往系統保護的內存地址寫數據最常見就是給一個指針以0地址。2)內存越界(數組越界,變量類型不一致等): 訪問到不屬於你的內存區域。解決方法:我們在用C/C++語言寫程序的時候,內存管理的絕大部分工作都是需要我們來做的。實際上,內存管理是一個比較繁瑣的工作,無論你多高明,經驗多豐富,難免會在此處犯些小錯誤,而通常這些錯誤又是那麼的淺顯而易於消除。但是手工“除蟲”(debug),往往是效率低下且讓人厭煩的,本文將就段錯誤這個內存訪問越界的錯誤談談如何快速定位這些段錯誤的語句。下面將就以下的一個存在段錯誤的程序介紹幾種調試方法: 1 dummy_function (void)2 {3 unsigned char *ptr = 0x00;4 *ptr = 0x00;5 }67 int main (void)8 {9 dummy_function ();1011 return 0;12 } 作為一個熟練的C/C++程序員,以上代碼的bug應該是很清楚的,因為它嘗試操作地址為0的內存區域,而這個內存區域通常是不可訪問的禁區,當然就會出錯了。我們嘗試編譯運行它: xiaosuo@gentux test $ ./a.out段錯誤 出錯並退出。 這種方法也是被大眾所熟知並廣泛採用的方法,首先我們需要一個帶有調試信息的可執行程序,所以我們加上“-g -rdynamic的參數進行編譯,然後用gdb調試運行這個新編譯的程序,具體步驟如下: xiaosuo@gentux test $ gcc -g -rdynamic d.cxiaosuo@gentux test $ gdb ./a.outGNU gdb 6.5Copyright (C) 2006 Free Software Foundation, Inc.GDB is free software, covered by the GNU General Public License, and you arewelcome to change it and/or distribute copies of it under certain conditions.Type show copying to see the conditions.There is absolutely no warranty for GDB. Type show warranty for details.This GDB was configured as i686-pc-linux-gnu...Using host libthread_db library /lib/libthread(gdb) rStarting program: /home/xiaosuo/test/a.outProgram received signal SIGSEGV, Segmentation fault.0x08048524 in dummy_function () at d.c:44 *ptr = 0x00;(gdb) 不用一步步調試我們就找到了出錯位置d.c文件的第4行,其實就是如此的簡單。從這裡我們還發現進程是由於收到了SIGSEGV信號而結束的。通過進一步的查閱文檔(man 7 signal),我們知道SIGSEGV默認handler的動作是打印”段錯誤的出錯信息,併產生Co......

linux運行程序段錯誤··要怎麼解決··

在編程中以下幾類做法容易導致段錯誤,基本是是錯誤地使用指針引起的

1)訪問系統數據區,尤其是往 系統保護的內存地址寫數據

最常見就是給一個指針以0地址, unsigned char *ptr = 0x00;

2)內存越界(數組越界,變量類型不一致等) 訪問到不屬於你的內存區域

我以前也遇到過這個問題後來就是參考這個帖子找到問題的,希望可以幫助到你

http://blog.csdn.net/yeyuangen/article/details/6822004

linux裡解決段錯誤最簡單的方法是?

重裝沒有用,core dump是應用程序問題。

當程序運行的過程中異常終止或崩潰,操作系統會將程序當時的內存狀態記錄下來,保存在一個文件中,這種行為就叫做Core Dump(中文有的翻譯成“核心轉儲”)。

C語言段錯誤怎麼弄,輸出的結果都是對的,在PAT裡面提交就說有段錯誤,哪位大神幫我看看

while(scanf("%d",&n)!=EOF)改成

while(scanf("%d",&n)==1)應該就好了。

主要原因是,scanf("%d",&n)的不正確的輸入可能使n是特別的值,超出正常範圍,從而導致後面a[n]中下標超出原來的範圍

malloc產生段錯誤怎麼回事??

把二級指針改成一級指針就可以了。

struct Node

{

int Data;

struct Node *Next;

};

/*--------------單鏈表的建立(從前向後一次插入節點)--------------------------------------------------*/// head *head **head

void CreateSingleList(struct Node *Head)

{

Node *pNode,*pNodeNew;

int x;

Head = (struct Node*)malloc(sizeof(struct Node));//建立空鏈表

Head->Next = NULL;

printf("Input the data : \n");

scanf("%d",&x);

while (x!=-1)

{

pNodeNew = ( struct Node*)malloc(sizeof( struct Node));//為新的節點申請空間

pNodeNew->Data = x;

if (Head->Next == NULL)

{

Head->Next = pNodeNew;//空節點的尾指針指向新節點

}

else

{

pNode->Next = pNodeNew;//在已經建立的節點後插入新節點

}

pNode = pNodeNew;//保存新建節點的頭指針

printf("Input the data : \n");

scanf("%d",&x);

}

pNode->Next = NULL;

}

int main (int argc, char *argv[])

{

Node *Nx;

CreateSingleList(Nx);

return 0;

}

我個人認為的是你傳的二級指針Nx,你知道Nx的地址是什麼嗎,Nx是個野指針,好了,既然是野指針,然後你就給*Nx malloc了,這是不允許的!

ACM編程問題,提交說答案錯誤,段錯誤怎麼回事呢?麻煩看一下

段錯誤就是數據溢出了啊

linux 函數 readddir 獲取文件目錄 出現段錯誤 不知如何解決

為什麼用while(dir)來做循環?

yum提示段錯誤怎麼回事

估計是以前網絡可用時下載好了緩存。 你現在的網絡出了問題。 你可以執行一下yum clean all之後,再執行 yum insall samba 看一下這時的錯誤提示。

這個鏈表程序出現段錯誤,是什麼原因,如何解決?

//代碼段1:#include #include typedef struct student{ int no; struct student *next;}student;int main(){ student *head=NULL,*p1=NULL,*p2=NULL,*p=NULL; int oneItem; printf("Input No:"); scanf("%d",&oneItem); if(oneItem==0) //先檢查輸入的號碼是否為0 { printf("\n沒有學生數據.\n"); return 0; } //確認了輸入號碼不為0,再分配動態內存,保存數據 p1=(student *)malloc(sizeof(student)); if(p1==NULL) { printf("\n分配動態內存出錯.\n"); return 0; } p1->no=oneItem; p1->next=NULL; //必須讓p1->next等於NULL head=p1; //head指向第1個節點 p2=p1; //p2指向當前節點,p1是新節點 while(1) { printf("Input No:"); scanf("%d",&oneItem); if(oneItem==0) //先檢查輸入的號碼是否為0 { break; } //確認了輸入號碼不為0,再分配動態內存,保存數據 p1=(student *)malloc(sizeof(student)); if(p1==NULL) { printf("\n分配動態內存出錯.\n"); return 0; } p1->no=oneItem; p1->next=NULL; p2->next=p1; //將新節點p1加在p2的末尾 p2=p1; //p2指向當前節點 } p=head; while(p) //語句while(p)就是相當於while(p!=NULL) { printf("%d\n",p->no); p=p->next; } return 0;}

//代碼段2的問題: ...... while(p1->no) { n++; if(head==NULL) head=......

相關問題答案
段錯誤怎麼解決?
電腦證書錯誤怎麼解決?
文件存取錯誤怎麼解決?
應用程序錯誤怎麼解決?
軟件腳本錯誤怎麼解決?
驅動程序錯誤怎麼解決?
電腦一直出現指令碼錯誤怎麼解決? ?
虛電怎麼解決?
電腦終止程序怎麼解決?
代碼內存溢出怎麼解決?