這個問題在這里已經有了答案: 將資料復制/掃描/讀取到未初始化的指標時發生崩潰或“分段錯誤” 5 個答案 12 小時前關閉。
我一直在閱讀 K&R 第 2 版書,并且一直試圖讓其中一個示例正常運行。
直接取自本書第 5 章的代碼(我在 main 中添加了一些隨機變數):
static char daytab[2][13] = {
{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
{0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
};
/* day_of_year: set day of year from month & day */
int day_of_year(int year, int month, int day)
{
int i, leap;
leap = year%4 == 0 && year%100 != 0 || year%400 == 0;
for (i = 1; i < month; i )
day = daytab[leap][i];
return day;
}
/* month_day: set month, day from day of year */
void month_day(int year, int yearday, int *pmonth, int *pday)
{
int i, leap;
leap = year%4 == 0 && year%100 != 0 || year%400 == 0;
for (i = 1; yearday > daytab[leap][i]; i )
yearday -= daytab[leap][i];
*pmonth = i;
*pday = yearday;
}
int main(){
int x = 5, y = 10;
int *q, *p;
month_day(x, y, q, p);
}
這個程式給了我分段錯誤,所以我嘗試在 gdb 中運行它。
我在 month_day 函式中設定了一個斷點,一些東西立刻引起了我的注意。
gdb 顯示 pmonth 被初始化為某個地址,但 pday 被初始化為 0x0。這不可能是正確的,我知道,但首先是什么導致了這種情況?
這是在 gdb 中帶有引數的 month_day 函式:
month_day (year=5, yearday=10, pmonth=0x7fffffffe150, pday=0x0) at e5-8.c:19
正如預期的那樣,當嘗試列印 *pmonth 時,它可以正常作業,但列印 *pday 并沒有,因為它初始化為 0x0。
gdb 輸出:
19 leap = year%4 == 0 && year%100 != 0 || year%400 == 0;
(gdb) print pday
$1 = (int *) 0x0
(gdb) print *pday
Cannot access memory at address 0x0
(gdb) print *pmonth
$2 = 1
這很可能是一個簡單的解決方法,但我也想了解發生了什么!
uj5u.com熱心網友回復:
您需要傳遞有效地址。也許你只是想要:
int main(void){
int x = 5, y = 10;
int q, p;
month_day(x, y, &q, &p);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/416401.html
標籤:
上一篇:C中鏈表內的動態陣列
下一篇:獲取固定記憶體位置的內容
