2017-08-07 14 views
3

文字列を関数に直接渡すのは悪い習慣ですか?文字列を関数に直接渡す

メモリにエラーが発生しますか?

func(char *x) { 
    //do stuff 
} 

func("String"); 

これを行う方が安全でしょうか?

char *s = "string"; 
func(s); 
+3

funcでは、constとしてポインタを宣言します。 'func()' - その戻り値の型 - が文字列を変更した場合、与えられた文字列がポインタ 's'を介して渡されたかどうかにかかわらず、実際に文字列リテラルであれば、 'func()'が文字列を変更しない場合、なぜ引数が 'void func(const char * x)'と宣言されていないのですか? –

+1

@Delonous両方の呼び出しが間違っていて安全ではありません。 –

答えて

4

それはメモリエラーを引き起こすのでしょうか?

この文字列を変更しようとする可能性があります。

あなたの関数

func(const char *x) { 

を宣言しかし、何も悪いが、関数に文字列リテラルを渡すには存在しない安全であると。そうでなければ、99.99のプログラムがひどく書かれています。

これを行う方が安全でしょうか?

char *s = "string"; 
func(s); 

あなたは同じ文字列リテラル

へのポインタを渡すように、それは何も変わりません。しかし、あなたがRWを割り当てるよう以下のコードは安全です(読み取り/書き込み)文字列に対応するためのメモリ、およびこの割り当てられたスペースにリテラルシステムコピー

2
char s[] = "string"; 
func(s); 
func(char *x) { 
    //do stuff 
} 

この関数は、入力として文字列にポインタをとります。インターフェイスは、の書き込みをxから書き込むことができます。

しかしリテラル(あなたの例のどちらの場合も)文字列を使用しているので、元gccは仕方のコード/データを整理し、この文字列リテラル(およびほとんどのコンパイラのメモリを変更することは違法です

char s[] = "string"; 
func(s); 

場合や: - - もちろんまたは読み取り)SEGV)

「安全」として長く書くときは、文字列の範囲外に行かないような方法(:それはそれをやってからあなたを防ぎますの内容を変更するつもりはありません安全性に差はありません

func(const char *x) 
関連する問題