2017-10-07 67 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

相关问题