strncpy()在第二次调用同一来源

时间:2017-10-07 12:21:53

标签: c string windows c-strings

我是c的新手,想要将字符串分成两部分。这是我的代码:

#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);
}

我想abc变量a和变量defb。但我的问题是它失败了Segmentation Fault。在我运行之后,我得到了这个输出:

a -> abc
Segmentation fault

我无法理解为什么。我使用cygwin并使用命令

构建它

gcc test.cpp -o test.exe

很抱歉,如果问题听起来很愚蠢。谢谢。

1 个答案:

答案 0 :(得分:3)

array-subscript-operator []的优先级高于取消引用运算符*

所以你要改变

*a[3] = ...

(*a)[3] = ...

b相同。

将编译器的警告级别设置得足够高,应该已经警告过你。或者至少告诉你,他们的东西很可疑

*a[3] = '\0';