2013-10-28 8 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; 
} 

「シェル>」プロンプトで、gccが私に次のエラーを与えます:

Segmentation fault (core dumped) 
+0

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

+4

フォーマット文字列が間違っています。 '%s'ではなく、%sでなければなりません。 –

+1

'int main(int argc、char * argv [])'を試してください。 – Beta

答えて

86

「セグメンテーションフォルト」は、アクセス権のないメモリにアクセスしようとしたことを意味します。

最初の問題は、引数がmainであることです。 main関数はint main(int argc, char *argv[])で、argv[1]にアクセスする前にargcが2以上であることを確認する必要があります。あなたはfloatprintfprintfに渡すときに、方法によって、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 [])'または同等のものが受け入れられ、 'int'で定義されたtypedef名で置き換えられるか、' argv'の型は 'char ** argv'と書くことができます。 本当に、それはスタイルの問題です。 (5.1.2.2.1プログラムの起動を参照) –

関連する問題