[英]Getting a segmentation fault in C with unsigned long long int?
[英]Getting segmentation fault after performing arithmetic on unsigned int
代碼如下。 我遇到細分錯誤,無法理解原因。 我認為這是因為我對變量t和k(都是無符號int)所做的算術運算,任何人都可以解釋為什么發生這種分段錯誤。
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
int main() {
unsigned int n,k,q,i,t;
scanf("%u %u %u",&n,&k,&q);
unsigned int a[n];
for(i=0;i<n;i++)
{
scanf("%u",&a[i]);
}
for(i=0;i<q;i++)
{
scanf("%u",&t);
if(t-k>0)
printf("%u\n",a[t-k]);
else
printf("%u\n",a[t-k+n]);
}
return 0;
}
我認為問題與此if陳述有關
if(t-k>0)
printf("%u\n",a[t-k]);
由於t
和k
都是無符號整數,因此即使t
小於k
, tk
的結果也總是非負的。 但是結果可以給出數組元素a[tk]
的wong索引
else語句
else
printf("%u\n",a[t-k+n]);
僅在t
等於k
時才執行。:),但是在這種情況下,tha數組t-k+n
的索引將等於n並引用beyind數組。
printf("%u\n",a[t-k+n]);
考慮到if語句中的組合
if(t-k>0)
可以代替
if ( t > k )
但是無論如何,您應該檢查輸出元素的結果索引是否有效。
由於代碼很小,因此這可能是開始使用gdb的好機會。 這樣,您可以節省很多時間。 這是一個入門教程 。
問題出在這里:
if(t-k>0) // <- HERE!
printf("%u\n",a[t-k]);
else
printf("%u\n",a[t-k+n]);
因為t
和k
是無符號整數。 這些變量的一些值將暴露該問題。 例如,我在if-else語句之前添加了printf()
,然后得到:
2
2
2
1
2
1
RESULT: -1
Segmentation fault (core dumped)
因此,您可以看到,由於變量是無符號整數,所以無論t
和k
的值是多少, tk
的結果始終是非負的,這是對無符號整數進行運算的結果。
作為解決方案,您可以將這兩個變量設置為整數,如下所示:
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
int main() {
unsigned int n,q,i;
int t,k;
scanf("%u %d %u",&n,&k,&q);
unsigned int a[n];
for(i=0;i<n;i++)
{
scanf("%u",&a[i]);
}
for(i=0;i<q;i++)
{
scanf("%d",&t);
printf("RESULT: %d\n", t-k);
if(t-k>0)
printf("%u\n",a[t-k]);
else
printf("%u\n",a[t-k+n]);
}
return 0;
}
現在輸出變為:
2
2
2
1
2
1
RESULT: -1
2
可以看到,這里沒有發生分段錯誤,並且按預期打印了2條。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.