【发布时间】:2015-08-17 09:59:59
【问题描述】:
代码如下。我得到分段错误无法理解为什么。我认为这是因为我对变量 t 和 k(都是 unsigned 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(t-k>0)...提示:未签名的操作。考虑 t = 1, k = 2.... -
谢谢@SouravGhosh,知道了。
-
这显示了正确使用编译器警告的重要性。启用大量警告,它应该会告诉您将
unsigned与零进行比较。 -
@TobySpeight,
gcc -Wall -pedantic px.c没有发出相对警告。我应该使用哪个标志? -
@gsamaras 我认为
-Wall -Wextra可能就足够了,但我承认没有对此进行测试。所以我可能需要修改我的评论——如果你测试了t-k>=0,它会警告你,因为a[0+n]超出了范围。
标签: c segmentation-fault unsigned-integer integer-arithmetic