2011-06-03 92 views
2

我有一個C程序寫在UNIX上。我正在分段錯誤。我沒有得到我錯過的東西。任何人都可以請幫忙。C程序導致段錯誤

#include <stdio.h> 
#include <stdlib.h> 
#include <strings.h> 
char*     app_name = NULL; 
char*   pInFile = NULL; 
int main(int argc, char *argv[]) 
{ 
    char*    arg0 = argv[0]; 
    char*    pdebug = "miecf"; 
    char*      pLogfile = NULL; 
    char*    pUserid = NULL; 
    char*    pOutFile = NULL; 
    int   c; 

    while((c = getopt(argc, argv, ":a:d:i:l:u:o")) != EOF) 
    { 
     switch (c) 
     { 
     case 'a': 
      app_name = optarg; 
      break; 

     case 'd': 
      pdebug = optarg; 
      break; 

     case 'i': 
      pInFile = optarg; 
      break; 

     case 'l': 
      pLogfile = optarg; 
      break; 

     case 'u': 
      pUserid = optarg; 
      break; 

     case 'o': 
      pOutFile = optarg; 
      break; 

     default: 
       fprintf(stderr, "unknown option \'%c\'\n", optopt); 
       break; 
     } /* switch(c) */ 
    } /* while(getopt()) */ 


     printf("app_name is [%s]\n",app_name); 
     printf("pdebug is [%s]\n",pdebug); 
     printf("pInFile is [%s]\n",pInFile); 
     printf("pLogfile is [%s]\n",pLogfile); 
     printf("pUserid is [%s]\n",pUserid); 
     printf("pOutFile is [%s]\n",pOutFile); 

     return 0; 
} 

運行命令

-a test -d deimf -i input.txt -l log.txt -u [email protected] -o out.txt 

輸出

app_name is [test] 
pdebug is [deimf] 
pInFile is [input.txt] 
pLogfile is [log.txt] 
pUserid is [[email protected]] 
run[2]: 10448 Segmentation Fault(coredump) 

DBX報告

program terminated by signal SEGV (no mapping at the fault address) 
0xff232370: strlen+0x0050:  ld  [%o2], %o1 
(dbx) where 
=>[1] strlen(0x0, 0xfffffaf0, 0x0, 0xffbff1a8, 0x0, 0x2b), at 0xff232370 
    [2] _ndoprnt(0x10f77, 0xffbff26c, 0xffbfe8e9, 0x0, 0x0, 0x0), at 0xff29e4d4 
    [3] printf(0x10f68, 0x21100, 0x0, 0x2111e, 0xff3303d8, 0x14), at 0xff2a0680 
    [4] main(0xc, 0xffbff304, 0xffbff4ad, 0xffbff4b8, 0x0, 0xffffffff), at 0x10e8 
+1

-1:你在調試器中運行程序時,賽格發生故障定位? – 2011-06-03 13:49:21

+0

@油,是的,我做過。我正在添加dbx報告 – 2011-06-03 13:51:29

+0

好吧,那更像是它! -1刪除... – 2011-06-03 13:54:29

回答

9

問題是當您嘗試打印它時,pOutFile爲NULL。許多操作系統(libc)不處理這個問題,而你試圖讓它打印一個沒有值的變量。

試試這個:

if (pOutFile != NULL) 
    printf("pOutFile is [%s]\n",pOutFile); 
else 
    printf("pOutFile is NULL\n"); 

補充:當您指定-o開關

pOutFile沒有價值,甚至因爲你沒有把一:後鄰在getopt調用中。具體來說:在之後來信。它應該是這樣的:

while((c = getopt(argc, argv, "a:d:i:l:u:o:")) != EOF) 
+0

我的問題是爲什麼pOutFile沒有價值。我已通過添加-o – 2011-06-03 13:55:12

+2

更新過。調用printf並且*假設*你的用戶提供了一個值仍然不安全,所以即使你修復了-o問題,我仍然推薦上面的值檢查。 – 2011-06-03 13:59:04

+0

謝謝Wes,我得到了答案。這是一個愚蠢的錯誤,但讓我徘徊了近一個小時。感謝您的幫助 – 2011-06-03 14:03:56

3

看起來你在這一行段錯誤:

printf("pOutFile is [%s]\n",pOutFile); 

,你不使用-o開關通過命令行的情況來看,這樣pOutFile保持爲空,但你要printf它。

+0

是的,我在你指定的行得到seg故障,但我不明白爲什麼? – 2011-06-03 14:01:56

2

「運行命令-a測試-d deimf -i input.txt中的log.txt -l -u BC @ ABC out.txt」

你根本忘了給-o選項:

運行命令-a測試-d deimf -i input.txt中的log.txt -l -u BC @ ABC -o out.txt

+0

我已經加了-o,仍然沒有解決問題 – 2011-06-03 13:54:27

2

您沒有通過-o前「out.txt」,所以你在pOutFile的printf中取消了一個空指針。這就是我第一眼看到的。

3

缺少:的問題是:

while((c = getopt(argc, argv, ":a:d:i:l:u:o:")) != EOF) 
              ^
+0

這是幹什麼的? – 2011-06-03 14:01:26

+0

擊敗了我。 :) @Nathan,它告訴'getopt' -o選項帶有一個參數。 – andrewdski 2011-06-03 14:04:07

+0

謝謝Codaddict – 2011-06-03 14:04:26