2013-10-28 51 views
60

我試圖寫在linux下一個C程序,具有參數的開方,下面的代碼:什麼是分段錯誤(核心轉儲)?

#include<stdlib.h> 
#include<stdio.h> 
#include<math.h> 

int main(char *argv[]){ 
    float k; 
    printf("this is consumer\n"); 
    k=(float)sqrt(atoi(argv[1])); 
    printf("%s\n",k); 
    return 0; 
} 

後,我在我的輸入型「殼>」提示符下,海灣合作委員會給了我下面的錯誤:

Segmentation fault (core dumped) 
+0

http://en.wikipedia.org/wiki/Core_dump –

+4

錯誤的格式字符串中使用,你需要'%F',不'%s' –

+1

嘗試'INT主(INT ARGC,CHAR *的argv [])'。 – Beta

回答

86

「分段錯誤」表示您試圖訪問您無權訪問的內存。

第一個問題是您的參數mainmain函數應該是int main(int argc, char *argv[]),在訪問argv[1]之前,您應該檢查argc是否至少爲2。

而且,由於你傳遞一個floatprintf(其中,順便說一句,被傳遞到printf時轉換爲double),你應該使用%f格式說明。格式說明符%s用於字符串('\0' - 終止字符數組)。

+1

非常感謝: - * :) – user2929110

+0

我被教導應該是'int main(int argc,char ** argv)'而不是'int main(int argc,char * argv [])''。雖然你說的方式是正確的,但是char * * \ *是實際的'正確'的方法,因爲它代表了一個指向字符的指針。 –

+2

@WillHopkins標準認爲'int main(void)'和'int main(int argc,char * argv [])'或同等值是可以接受的,在「equivalent」之後加上「that」,「int」被定義爲「int」的typedef名稱取代,或者'argv'的類型可以寫爲 'char ** argv',依此類推。所以真的,這是一個風格問題。 (見5.1.2.2.1程序啓動) –