2015-04-21 96 views
0

所以我已經將segfault追蹤到線,但我不明白爲什麼這是一個段錯誤。有人能詳細說明我的方式錯誤嗎?這是爲什麼Segfault發生?

這裏是變量聲明。

size_t i, j, n, m, chunk_size, pixel_size; 
i = j = n = m = 0; 
chunk_size = 256; 
pixel_size = 4; 

這裏是數組聲明。

uint8_t** values = new uint8_t*[chunk_size]; 
for (i = 0; i < chunk_size; ++ i) 
    values[i] = new uint8_t[chunk_size]; 

float** a1 = new float*[chunk_size]; 
for (i = 0; i < chunk_size; ++i) 
    a1[i] = new float[chunk_size]; 

這裏是段錯誤發生的地方。

float delta, d; 

for (i = 0; i < 256; ++i) { 
    for (j = n = m = d = 0; j < 256; j = m) { 
     while (i == 0 || d != 0) { 
      d = a1[i][m]; <------SEGFAULT per GDB 
      ++m; 
     } 
     delta = (d - a1[i][j])/m; 
     n = j + 1; 
     while (n < j + m) { 
      a1[i][n] = a1[i][n - 1] + delta; 
      ++n; 
     } 
    } 
} 

我對C++相當陌生,無法弄清楚爲什麼會出現段錯誤。這不是將數組變量設置爲變量的正確方法嗎?這是我的段錯誤的來源嗎?

注意:這整個事情的重點是用我的簡單插值公式將4x4陣列擴展到256x256陣列。

+2

只要m大於或等於chunk_size,就會越過數組的邊界。這將是我的猜測。 我還建議使用有意義的變量名稱,我,j,n,m和d不是非常具有描述性,並且使得難以弄清楚你正在嘗試做什麼。 –

+1

當調用'd = a1 [i] [m];''時,絕對確定'i'和'm'是否在界限內? –

+2

你的while循環沒有針對'm'超出範圍的安全性。 –

回答

1
while (i == 0 || d != 0) { 
    d = a1[i][m]; <------SEGFAULT per GDB 
    ++m; 
} 

這是無端循環while,在某些情況下(例如,在外部循環的第一次迭代)。

+0

無限循環遞增數組索引=>砰砰聲 – pm100

1

您的外循環從i = 0開始,內循環以d = 0開始,而控制while循環的邏輯不足(請參閱代碼註釋)。

for (i = 0; i < 256; ++i) { 
    for (j = n = m = d = 0; j < 256; j = m) { 
     // Here i == 0 is ALWAYS true (so d != 0 is ignored due to 
     // short-circuit evaluation) and then 'm' is continuously incremented 
     // until it goes out of bounds 
     while (i == 0 || d != 0) { 
     d = a1[i][m]; <------SEGFAULT per GDB 
     ++m; 
    } 
    delta = (d - a1[i][j])/m; 
    n = j + 1; 
    while (n < j + m) { 
     a1[i][n] = a1[i][n - 1] + delta; 
     ++n; 
    } 
} 
1

的問題是下面幾行:

while (i == 0 || d != 0) { 
     d = a1[i][m]; <------SEGFAULT per GDB 
     ++m; 
} 

while循環會一直下去,而i等於0。因爲你永遠不遞增while循環im不斷遞增永遠直到到達超出範圍,導致您遇到的段錯誤問題。

請確保您檢查了im的值,以便它們位於已分配的內存範圍內,並且您的代碼可以正常工作。