2012-12-11 80 views
1

我測試下面的代碼時,我總是收到分段錯誤。在搜索網頁後,我目前無法找到答案。Mallocing unsigned char數組存儲整數

a = (byte *)malloc(sizeof(byte) * x) ; 

for(i = 0 ; i < x-1 ; i++) 
{ 
scanf("%d", &y) ; 
a[i] = y ; 
} 

y和x都被初始化。 X是用戶確定的數組的大小。 分段錯誤是由倒數第二個到最後一個整數加起來的,我通過添加 printf(「roar」);然後將[i]設置爲y並一次輸入一個數字。 字節是一個unsigned char的typedef。

注:

#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

你能展示a是如何聲明的嗎?如果a被聲明爲除了一個字節以外的任何東西,那麼您將不會分配足夠的空間。 – PeterJ

+0

@PeterJ byte * a; –

+0

這應該是好的。同時檢查y是否被聲明爲int。對於任何其他人來說,將額外的代碼添加到您的問題中可能是值得的。 – PeterJ

回答

1

:我也用

a[i] = (byte)y ; 

A被如下

byte *a ; 

ininitalized如果您需要查看整個代碼正是這種嘗試運行該代碼我得到了一個調試異常,因爲選擇的初始值沒有定義,所以應該添加

choice = 0; 

在while循環之前。另外,下面的語句:

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

應該是:

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

如果您使用的編譯器,無論是檢測這兩個的可能導致異常未初始化的內存。在進行這些更改後,它在Visual Studio 2010下運行良好。我還建議打開編譯器的最大警告級別,它可能會找到第一種情況。

我不確定這是你想要的,但是在內部case語句的嵌套情況下,最後的中斷缺失,所以它總是轉到「感謝您使用此程序」部分,而不是循環返回選擇。另外,因爲return語句用於退出函數,而不是隻允許它放到底部空閒(a)永遠不會被調用。

與其嵌套案例我建議闖入兩個函數,離開它的頂級案件,然後有一個像perform_sort這樣的功能,有一個情況下,根據用戶輸入做正確的排序。這將使得它更容易遵循,您也可以在調用該函數後打印結果,而不是重複循環來打印結果。

+0

感謝您的幫助,但我仍然遇到分段錯誤。只有現在它在最後的入口。 –

+0

我剛剛添加了一些建議,不確定它會修復它,但是分解代碼會使它更容易跟蹤並確保內存被釋放。 – PeterJ

相關問題