簡體   English   中英

對unsigned 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]);

由於tk都是無符號整數,因此即使t小於ktk的結果也總是非負的。 但是結果可以給出數組元素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]);

因為tk是無符號整數。 這些變量的一些值將暴露該問題。 例如,我在if-else語句之前添加了printf() ,然后得到:

2
2
2
1
2
1
RESULT: -1
Segmentation fault (core dumped)

因此,您可以看到,由於變量是無符號整數,所以無論tk的值是多少, 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM