当我测试以下代码时,我不断遇到分段错误。我在浏览网页后目前无法找到答案。
a = (byte *)malloc(sizeof(byte) * x ) ;
for( i = 0 ; i < x-1 ; i++ )
{
scanf("%d", &y ) ;
a[i] = y ;
}
y和x都被初始化。 X是用户确定的数组大小。 分段错误是要添加的第二个到最后一个整数,我通过添加找到了它 printf(“咆哮”);在将[i]设置为y并一次输入一个数字之前。 字节是unsigned char的typedef。
注意:我也尝试过使用
a[i] = (byte)y ;
A如下所示
byte *a ;
如果您需要查看整个代码,请执行以下操作:
#include <stdio.h>
#include <stdlib.h>
#include "sort.h"
int p_cmp_f () ;
int main( int argc, char *argv[] )
{
int x, y, i, choice ;
byte *a ;
while( choice !=2 )
{
printf( "Would you like to sort integers?\n1. Yes\n2. No\n" ) ;
scanf("%d", &choice ) ;
switch(choice)
{
case 1:
printf( "Enter the length of the array: " ) ;
scanf( "%d", &x ) ;
a = (byte *)malloc(sizeof( byte ) * x ) ;
printf( "Enter %d integers to add to the array: ", x ) ;
for( i = 0 ; i < x -1 ; i++ )
{
scanf( "%d", &y ) ;
a[i] = y ;
}
switch( choice )
{
case 1:
bubble_sort( a, x, sizeof(int), p_cmp_f ) ;
for( i = 0 ; i < x ; i++ )
printf( "%d", a[i] ;
break ;
case 2:
selection_sort( a, x, sizeof(int), p_cmp_f ) ;
for( i = 0 ; i < x; i++ )
printf( "%d", a[i] ;
break ;
case 3:
insertion_sort( a, x, sizeof(int), p_cmp_f ) ;
for( i = 0 ; i < x ; i++ )
printf( "%d", a[i] ;
break ;
case 4:
merge_sort( a, x, sizeof(int), p_cmp_f ) ;
for( i = 0 ; i < x ; i++ )
printf( "%d", a[i] ;
break ;
case 5:
quick_sort( a, x, sizeof(int), p_cmp_f ) ;
for( i = 0 ; i < x ; i++ )
printf( "%d", a[i] ;
break ;
default:
printf("Enter either 1,2,3,4, or 5" ) ;
break ;
}
case 2:
printf( "Thank you for using this program\n" ) ;
return 0 ;
break ;
default:
printf( "Enter either 1 or 2: " ) ;
break ;
}
}
free(a) ;
return 0 ;
}
int p_cmp_f( byte *element1, byte *element2 )
{
return *((int *)element1) - *((int *)element2) ;
}
答案 0 :(得分:1)
运行该代码我得到了一个调试异常,因为没有定义选择的初始值,你应该添加
choice = 0;
在while循环之前。还有以下声明:
for( i = 0 ; i < x -1 ; i++ )
应该是:
for( i = 0 ; i < x; i++ )
如果您使用的是检测未初始化内存的编译器,则这两者中的任何一个都可能导致异常。在进行这些更改后,它在Visual Studio 2010下运行正常。我还建议打开编译器的最大警告级别,它可能会在第一种情况下启动。
我不确定这是不是你想要的但是在内部case语句的嵌套情况下,最后的中断缺失所以它转到“谢谢你使用这个程序”部分总是而不是循环回来进行另一个选择。另外因为return语句用于退出函数而不是仅仅允许它掉到底部(a)永远不会被调用。
而不是嵌套我建议分成两个函数的情况,将顶级案例保留在原来的位置,然后使用像perform_sort这样的函数,它具有根据用户输入进行正确排序的情况。这将使得它更易于遵循,您也可以在调用该函数后打印结果,而不是复制循环以打印结果。