99久久全国免费观看_国产一区二区三区四区五区VM_久久www人成免费看片中文_国产高清在线a视频大全_深夜福利www_日韩一级成人av

10種初學者最常見的c語言段錯誤實例及原因分析

段錯誤相信是每一個C語言初學者都會遇到的一個問題,

很多初學者看到這個錯誤就開始抓狂。

但是沒寫過段錯誤的程序員不是個合格的程序員!

一口君寫了這么多年代碼,有時候還是會出現段錯誤。

下面給大家整理了一些C 語言典型的段錯誤(Segmentation Fault)實例及代碼示例,按常見場景分類說明:

1. ‌引用空指針‌

#include int main() {    int *p = NULL;     printf("%d\n", *p); // 解引用空指針    return 0;}

‌原因‌:p 未指向有效內存地址。

2. ‌訪問受保護的內存地址‌

int *p = (int*)1;  // 強制將指針指向地址 0x1*p = 100;          // 訪問系統保護的內存區域

‌原因‌:嘗試操作內核或系統保留的內存區域。

3. ‌修改字符串常量‌

char *str = "hello";  // 字符串常量存儲在只讀區str[0] = 'H';         // 嘗試修改常量區數據

‌原因‌:字符串字面量存儲在只讀內存段,不可被修改6。

4. ‌棧溢出‌

void infinite_loop() {    infinite_loop();  // 無限遞歸導致棧空間耗盡}int main() {  infinite_loop(); }

‌原因‌:無限遞歸導致棧內存溢出6。

5. ‌數組越界訪問‌

int arr[5];arr[5] = 10;  // 合法索引為 0~4,越界訪問無效內存

‌原因‌:訪問超出數組定義大小的內存區域。

#include  int main() {     int arr[5] = {0, 1, 2, 3, 4};     printf("%d\n", arr[10]); // 訪問不存在的元素    return 0;}

執行結果:未定義行為,可能會導致程序崩潰或打印出垃圾值。

數組越界是一些新手最容易出錯的地方,經常因為數組下標控制不好,導致訪問越界,而這種情況可能99%幾率不是立刻報段錯誤,也可能程序運行幾年都不報錯, 但是它一旦報了錯,就會特別隱蔽,非常難查。

剛工作的時候在zte,曾經有2位大佬追一個德國運營商現場報的bug,花了一個月時間,最后發現是數組越界導致。

6. ‌使用未初始化的指針‌

int *p;        // 未初始化指針*p = 42;       // 野指針指向無效地址

‌原因‌:指針未指向有效內存空間。

7. ‌訪問已釋放的內存‌

int *p = malloc(sizeof(int));free(p);*p = 10;       // 內存釋放后繼續使用

‌原因‌:操作已被釋放的動態內存區域。

8. ‌緩沖區溢出‌

char buffer[5];strcpy(buffer, "HelloWorld");  // 超出 buffer 容量

‌原因‌:字符串操作超過目標緩沖區大小。

9. ‌雙重釋放內存‌

int *p = malloc(sizeof(int));free(p);free(p);  // 重復釋放同一塊內存

‌原因‌:多次釋放同一內存導致堆管理器異常。

10. ‌強制類型轉換錯誤‌

int num = 42;char *p = (char*)num;  // 將整數值強制轉換為地址*p = 'A';              // 訪問非法地址

‌原因‌:將非指針類型強制轉換為指針并解引用。

11.格式化字符串與參數類型不匹配示例

int data = 0;sprintf(buf,"%s",data);

12、忘記字符串結尾的空字符示例:

#include  int main() {     char str[5] = {'H', 'e', 'l', 'l', 'o'}; // 缺少 '\0'     printf("%s\n", str);    return 0;}

執行結果:未定義行為,可能會打印出亂碼直到遇到一個’\0’。

13、緩沖區溢出示例:

#include #include int main() {    char dest[5];        strcpy(dest, "Hello, World!"); // 目標緩沖區太小    printf("%s\n", dest);    return 0;}

執行結果:未定義行為,可能會崩潰或覆蓋內存。

14、未檢查類型大小示例:

#include  int main() {    char *p = (char *)malloc(10 * sizeof(int));    int *q = (int *)p; // 錯誤的假設char和int大小相同     for (int i = 0; i < 10; ++i) {        q[i] = i; // 可能導致內存越界    }     free(p);    return 0;}

執行結果:未定義行為,可能會導致內存越界。

15、變量未正確初始化示例:

#include  int main() {    int num = 123;     printf("%s\n", num); // 錯誤的格式化字符串,應為%d    return 0;}

執行結果:未定義行為,可能會打印出任意值。

16、忽視錯誤返回值示例:

#include #include int main() {     FILE *file = fopen("nonexistent.txt", "r");    if (!file) {        // 忽視錯誤,沒有處理    }     // 使用file...    fclose(file);    return 0;}

執行結果:如果文件不存在,程序會嘗試使用未初始化的指針,可能導致崩潰。

總結

段錯誤本質是訪問了非法內存地址,可通過以下方式避免:

  • 初始化指針并檢查有效性;
  • 避免越界操作數組或緩沖區;
  • 謹慎處理動態內存的分配與釋放;
  • 區分常量區與變量區的數據修改權限
  • 對一些庫函數返回值一定要判斷
聲明:本內容為作者獨立觀點,不代表電子星球立場。未經允許不得轉載。授權事宜與稿件投訴,請聯系:editor@netbroad.com
覺得內容不錯的朋友,別忘了一鍵三連哦!
贊 1
收藏 2
關注 181
成為作者 賺取收益
全部留言
0/200
成為第一個和作者交流的人吧
主站蜘蛛池模板: 日本黄色激情片 | 国产又大又粗又爽的毛片 | 卡一卡二卡三免费视频 | av线网 | 热久久性 | 60—70sexvideos老少配 | 国产精品一区二区av日韩在线 | 一级黄色日本 | 国产首页天堂在线 | 国产不卡一级无码视频 | 欧美rb视频 | 亚洲色在线无码国产精品不卡 | 无码人妻一区二区三区免费N鬼沢 | 乱亲女h秽乱长久久久 | 在线观看免费黄色小视频 | 少妇搡BBBB搡BBB搡AA | 小小影院久久 | 国产啪视频 | 亚洲中文字幕久久精品蜜桃 | av夜夜草 | 人妻互换一二三区激情视频 | xxxx精品| 恋夜久久 | 欧美成人69sss| 日本熟妇色一本在线看 | 亚洲精品色婷婷在线影院 | 免费网站看V片在线18禁无码 | 欧美人与动牲交片免费播放 | 免费AV片在线观看蜜芽TV | 午夜三区 | 激情白浆| 国产成人精品微拍视频网址 | 国产特级黄色片 | 精品少妇的一区二区三区四区 | 涩涩亚洲乱码精品 | www.一区二区三区.com | 凌晨三点免费视频www | 欧美日韩在线视频 | 人妻一本久道久久综合久久鬼色 | 中午字幕无线码一区2020 | 久久精品国产亚洲av麻豆小说 |