2017-10-07 13 views
0

私はcで新しく、2つの部分で文字列を区切りたいと思います。ここに私のコードは次のとおりです。同じソースの2番目の呼び出しでstrncpy()が失敗する

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

void test(char** a, char** b) 
{ 
    const char * c = "abcdef"; 

    *a = (char *)malloc(4* sizeof(char)); 
    *b = (char *)malloc(4* sizeof(char)); 


    strncpy(*a, c, 3); 

    *a[3] = '\0'; 

    fprintf(stderr, "a -> %s\n", *a); 



    strncpy(*b, c+3, 3); 

    *b[3] = '\0'; 

    fprintf(stderr, "b -> %s\n", *b); 

} 

int main() 
{ 
setvbuf (stderr, NULL, _IONBF, 0); 
char *a = NULL; 
char *b = NULL; 

test(&a, &b); 

fprintf(stderr, "a -> %s\n", *a); 
fprintf(stderr, "b -> %s\n", *b); 
} 

私は変数babca上の変数とdefを持っていると思います。しかし、私の問題は、それがSegmentation Faultで失敗するということです。私がこれを実行した後、私はこの出力を得ます:

a -> abc 
Segmentation fault 

なぜ理解できません。私はcygwinを使用して、問題が愚かに聞こえる場合

gcc test.cpp -o test.exe

申し訳コマンドでそれを構築しています。ありがとうございました。

答えて

3

配列サブスクリプトオペレータ[]は、逆参照演算子*より高い優先順位を持ちます。

だからbのための同じ

(*a)[3] = ... 

する

*a[3] = ... 

を変更したいです。


コンパイラの警告レベルを十分に高く設定すると、警告が表示されます。あるいは少なくとも

*a[3] = '\0'; 
+0

と生臭い何かが自分であることをあなたに言ったありがとうございました:) – Jakomo

+0

注 '[0] [3]'また、括弧を気にすることなく、働くだろうということ。 – ShadowRanger

+0

@ShadowRanger: "*カッコを気にすることなく*"同じ数の追加のカッコ/ブラケットとそれでもなお1文字( '0')を入力する...--) – alk

関連する問題