【问题标题】:strncpy() fails on second call for same sourcestrncpy() 在第二次调用同一源时失败
【发布时间】:2017-10-07 12:21:53
【问题描述】:

我是 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);
}

我想在变量a 上使用abc,在变量b 上使用def。但我的问题是Segmentation Fault 失败。运行此程序后,我得到以下输出:

a -> abc
Segmentation fault

我不明白为什么。我正在使用cygwin 并使用命令构建它

gcc test.cpp -o test.exe

对不起,如果问题听起来很愚蠢。谢谢。

【问题讨论】:

    标签: c string windows c-strings


    【解决方案1】:

    数组下标运算符[] 的优先级高于解引用运算符*

    所以你想改变

    *a[3] = ...
    

    成为

    (*a)[3] = ...
    

    b 也一样。


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

    *a[3] = '\0';
    

    【讨论】:

    • 请注意,a[0][3] 也可以使用,无需担心括号。
    • @ShadowRanger: "不用担心括号" 相同数量的附加括号/括号,还有一个字符 (0) 需要输入... ;-)
    • @alk:括号与括号完全不同,至少在美式英语中是这样。 ;-)
    猜你喜欢
    • 1970-01-01
    • 2021-04-02
    • 2010-12-21
    • 2012-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-13
    • 1970-01-01
    相关资源
    最近更新 更多