对未签名的char数组进行Mallocing以存储int



当我测试以下代码时,我一直遇到分段错误。我在网上搜索后,目前找不到答案。

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并一次输入一个数字。Byte是一个无符号字符的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. Yesn2. Non" ) ;
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 programn" ) ;
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) ;
}

运行该代码时,由于没有定义所选的初始值,我遇到了调试异常,您应该添加

choice = 0;

在while循环之前。还有以下声明:

for( i = 0 ; i < x -1 ; i++ )

应为:

for( i = 0 ; i < x; i++ )

如果您使用的编译器检测到未初始化的内存,那么这两种情况中的任何一种都可能导致异常。在进行了这些更改之后,它在VisualStudio2010下运行得很好。我还建议打开编译器的最大警告级别,它可能会出现第一种情况。

我不确定这是否是你想要的,但在内部case语句的嵌套case中,缺少最后一个break,所以它总是转到"谢谢你使用这个程序"部分,而不是循环回来进行另一个选择。此外,因为return语句用于退出函数,而不仅仅是允许它降到底部,所以永远不会调用(a)。

与其嵌套案例,我建议将其分解为两个函数,不如将顶层案例保留在原来的位置,然后使用类似perform_sort的函数,该函数具有根据用户输入进行正确排序的案例。这将使它更容易理解,并且您还可以在调用该函数后打印结果,而不是复制循环来打印结果。

相关内容

  • 没有找到相关文章

最新更新