2013-09-24 67 views
-1

它編譯得很好,但是當我嘗試運行該程序時,出現了分段錯誤。我「不能確定哪裏出了錯。C(gcc)中的分割錯誤

#include <stdio.h> 
#include <string.h> 
#include <unistd.h> 

int main(int argc, char ** argv) 
{ 
    int i, childpid; 


for (i = strlen(argv[1]); i >= 0; i --) { 
    if (fork() == 0) { 
     printf("%c\n",argv[1][i]); 
     break; 
    } 
}  
    return 0; 
} 
+1

'i'是得到自己出界。嘗試'i = strlen(argv [1]) - 1'(請記住,C中的數組是*基於零的*)。 – Maroun

+4

你如何運行它?如果你沒有參數運行它,'argv [1]'將會是'NULL'。 – unwind

+3

@MarounMaroun除了不超出範圍 - 指針指向終止NUL字節。 – 2013-09-24 13:31:11

回答

-1

如果argv[1]是一個長度爲1?

在第一循環i將是1,會發生什麼,但argv[1][1]是一個字符長串的終止空。

+0

這篇文章應該是評論 – david

+1

這是如何解釋分段錯誤? – 2013-09-24 13:32:29

1

您應該使用argc參數知道有多少爭論,從命令行發送的測試,如果它是運行您for語句之前大於1,因爲你的第一個參數將是節目名:

if (argc > 1) { 
    for (i = strlen(argv[1]) - 1; i >= 0; i --) { 
     if (fork() == 0) { 
      printf("%c\n",argv[1][i]); 
      break; 
     } 
    } 
} 

,或者,如果你只是要打印第一個字符,你可以做這樣的事情

if(argc > 1) { 
    if(strlen(argv[1]) > 0 && fork() == 0) { 
     printf("%c\n",argv[1][0]); 
    } else { 
     // for loop here 
    } 
} 
1
  1. 檢查所需的沒有。在argc
  2. 參數的字符串(char陣列)具有索引0元件length - 1

代碼:

int main(int argc, char ** argv) 
{ 
    int i, childpid; 

    if(argc < 2) { 
     printf("An argument is missing\n"); 
     return -1; 
    } 

    for (i = strlen(argv[1]) - 1; i >= 0; i --) { 
     if (fork() == 0) { 
     printf("%c\n",argv[1][i]); 
     break; 
    } 

    return 0; 
}  
+0

如果它有效,那不就是說printf(「%c \ n」,'\ 0')會出現seg錯誤嗎?因爲它似乎提供了一個適當的argv [1]。因爲我現在不在C上工作,所以無法測試它。 – Lyth

+0

@Lyth否,'printf(「%c \ n」,'\ 0')'不會分段錯誤。 – HAL

+0

謝謝。所以argv [1]必須爲空。 – Lyth