GCC下调试C语言程序为什么显示“段错误”?

GCC下调试C语言程序为什么显示“段错误”?,第1张

Ubuntu下访问冲突(Access Violation,比如数组下标越界,指针非法访问等)是报告"段错误"。这里大多数人都是用windows,很少会用Ubuntu的,我也是最近才学会在终端里用gcc编程序,并且故搭尺意写了个非法访问指针的程序,才知道“段错误”和windows下的访问冲突意思差不多的。

楼主,你的程序中确实存在隐患,不过好在被你的测试数据给发现了。变量r和u定义后没有初始化,导致它们可能具有非常大的值,而循环体也不能保证一定对它们重新赋值,这样最后用它们来做数组的下标很可能要越界的。

你的第二组数据,第一个是5,我们可以断定它就是最大值了,这样循环体中的else if的字句始终不会执行,u一直没有赋值,后面a[u]=e直接用u的值作隐族下标是不合适的。

其实楼主在循环开始前对max和min进行了初始化,建议你在这里先把u和r都赋为0,用它们当数组的下标,像min=a[r],以和你灶枝弊后面的风格一致。这样应该可以对所有合法数据通过了吧。

今天又看了一下,发觉这里面还有一个问题,楼主可以试试5,1,3,4,2,1就被覆盖掉了。我在你最后的两次交换之间加了个判断。这是改后的代码。

#include<stdio.h>

main()

{

int a[9],n,i,min,r,max,u,e//n表示输入数据的个数(小于10),r表示最小值的下标,u表示最大值的下标,e用于换值。

scanf("%d",&n)

scanf("%d",&a[0])

min=a[0]

r=0

max=a[0]

u=0

for(i=1i<ni++)

{

scanf("%d",&a[i])

if(min>a[i])

{

min=a[i]

r=i

}//挨个搜寻最小值,并记下下标

else if(max<a[i])

{

max=a[i]

u=i

} //挨个搜寻最大值,并记下下标

}//如果最后一个else什么也不做则不必带,C语言不要求if必须带else。

e=a[0]

a[0]=min

a[r]=e//最小值和第一个数交换

if(e==max)//如果原来的第一个数恰好是最大值,则更新前面循环所记录的最大值对应的下标u

u=r

e=a[n-1]

a[n-1]=max

a[u]=e//最大值和最后一个交换

for(i=0i<=n-1i++)

printf("%d ",a[i])//输出交换后

printf("\n")//最后加个换行,看着终端的新提示符被挤到一旁去了挺不爽的。

}

Gcc最基本的用法是∶gcc [options] [filenames] 其中options就是编译器所需要的参数,filenames给出相关的文件名称。 -c,只编译,不连接成为可执行文件,编译器只是由输入的.c等源代此裂码文件生成.o为后缀的目标文件,森亩闭通常用于编译不包含主程序的子程序文件。 -o output_filename,确定输出文件的名称为output_filename,同时这个名称不能和源文件同名。如果不给出这个耐中选项,gcc就给出预设的可执行文件a.out。 -g,产生符号调试工具(GNU的gdb)所必要的符号资讯,要想对源代码进行调试,我们就必须加入这个选项。 -O,对程序进行优化编译、连接,采用这个选项,整个源代码会在编译、连接过程中进行优化处理,这样产生的可执行文件的执行效率可以提高,但是,编译、连接的速度就相应地要慢一些。 -O2,比-O更好的优化编译、连接,当然整个编译、连接过程会更慢.

例子:

gcc -o test test.c

结果生成可执行文件test


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12418985.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-23
下一篇2023-05-23

发表评论

登录后才能评论

评论列表(0条)

    保存