2011-06-21 45 views
2

我通常在編寫程序時使用輸入文件,以免我一次又一次地輸入數字。如何在gdb中使用輸入文件

這裏是我寫的快速排序的一些地方是給我段錯誤

#include<stdio.h> 
int partition (int *,int,int); 
void quicksort (int *,int,int); 
int main() 
{ 
int i,j,a[15],choice; 
int length; 
printf("Entering numbers in array \n"); 
for(i=0;i<=14;i++) 
scanf("%d",&a[i]); 
printf("the sorted array is\n"); 
length=sizeof(a); 
quicksort(a,0,length-1); 
for(i=0;i<=14;i++) 
printf (" %d ",a[i]); 
} 
int partition(int *num,int p,int r) 
{ 
int x,j,i,temp; 
    x=num[r]; 
    i=-1; 
    for(j=0;j<=r-1;j++) 
    { 
    if(num[j]<=x) 
    { 
     i=i+1; 
     temp=num[i]; 
     num[i]=num[j]; 
     num[j]=temp; 
    } 
    } 
    num[i+1]=num[r]; 
return i+1; 
} 


void quicksort (int *num,int p,int r) 
{ 
int q; 
if (p<r) 
    { 
     q=partition(num,p,r); 
     quicksort(num,p,q-1); 
     quicksort(num,q+1,r); 
    } 
} 

這裏的程序input.txt中

43 12 90 3 49 108 65 21 9 8 0 71 66 81 

我輸入文件時II編譯如下

cc quicksort.c 
./a.out < input.txt           

現在我得到的輸出是

Entering numbers in array 
the sorted array is 
Segmentation fault 

我想知道的是我經常使用gdb來調試這樣的問題。 是否有可能在gdb我從同一個文件的輸入input.txt中

我設置爲使用gdb命令是

cc -g quicksort.c 
gdb 
GNU gdb (GDB) 7.1-ubuntu 
Copyright (C) 2010 Free Software Foundation, Inc. 
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> 
This is free software: you are free to change and redistribute it. 
There is NO WARRANTY, to the extent permitted by law. Type "show copying" 
and "show warranty" for details. 
This GDB was configured as "x86_64-linux-gnu". 
For bug reporting instructions, please see: 
<http://www.gnu.org/software/gdb/bugs/>. 
(gdb) file a.out 
(gdb) break quicksort.c:3 
(gdb) run 

現在我想知道的是怎麼用的輸入什麼文件在gdb中,這樣我就不再輸入我想輸入的數組了?

+0

[如何將gdb與輸入重定向一起使用?](http:// stackoverflow。問題/ 4758175 /如何使用GDB與輸入重定向) – Alex

回答

1

爲了進行調試,這條線添加到您的程序,並註釋掉第一個for循環

int a[] = {43, 12, 90, 3, 49, 108, 65, 21, 9, 8, 0, 71, 66, 81}; 

爲了獲得最大的調試信息,使用

編譯
gcc -ggdb3 qs.c 

和ru它在gdb中作爲

gdb -q ./a.out 

並且永遠不會退出你的gdb會話!如果你重新編譯它,gdb會自動注意並重新加載二進制文件;通過這種方式,您將始終設置您的斷點和您製作的其他任何東西。

由於別人給你的提示,問題出在哪裏,我可以透露一個共同的宏來得到一個靜態分配的數組的大小:-)

#define ARRAY_SIZE(x) (sizeof((x))/sizeof((x)[0])) 
+0

是我得到了什麼宏,只是想知道如果我不填滿所有15個指數,只有數組中的一些數字填充那麼在這種情況下,您的宏sizeof(x)將返回僅填充位置或所有15個位置(即60個字節)佔用的空間。 –

+0

如果你靜態分配一個數組來包含14個項目,如'a [14]'那麼這就是你將得到的。不管你是否填充數組,都沒關係。它將包含非初始化值,但仍然有14個。和gdb一樣。嘗試一下!在gdb中,您可以調用任何宏/函數,即輸入'p sizeof(a)'和'p sizeof(a)/ sizeof(a)[0]'並查看輸出結果 –

+0

很好,我明白了您的意思。另一個簡單的程序來看看你的宏如何工作,我沒有填充一個數組到全部,但它給了我完整的數組的大小。所以這只是產生了一個問題,有一種方法,我可以知道有多少個int數組的地方已經填充了數字,即我不想知道完整數組的長度,只是輸入了多少個數字。 –

0

的原因賽格故障也許這條線。

length = sizeof(a);

它的60.

您的r值max應該是15.整數分配4個字節。所以你的通話溢出,因此錯誤。

+0

現在你寵壞了所有的樂趣! –

+0

爲什麼這行錯誤?我知道整數是4個字節,你說我應該使用strlen而不是sizeof .. –

+0

偉大的一點。只是想知道如果我們有一個部分填充的數組,然後sizeof(a)/ sizeof(a [0 ])將只返回那些被佔用或將返回全部15個成員的大小,即60/4 –

相關問題