2017-10-07 139 views
0

我是新來的c,並且想要將字符串分成兩部分。這裏是我的代碼: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); 
} 

我想有abca變量和def變量b。但我的問題是,它與Segmentation Fault失敗。我跑在此之後,我得到這樣的輸出:

a -> abc 
Segmentation fault 

我不明白爲什麼。我使用cygwin,如果問題聽起來很愚蠢與命令

gcc test.cpp -o test.exe

對不起構建它。謝謝。

回答

3

數組下標運算符[]比引用運算符*具有更高的優先級。

所以,你想改變

*a[3] = ... 

(*a)[3] = ... 

同爲b


已經將編譯器的警告級別設置得足夠高,它應該已經警告過你。或者至少告訴你,他們是

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

非常感謝你有鬼:) – Jakomo

+0

注意,'A [0] [3]'也將工作,而不用擔心括號。 – ShadowRanger

+0

@ShadowRanger:「*無需擔心括號*」相同數量的其他括號/括號,還有一個字符('0')多於鍵入...... ;-) – alk