0

这应该复制一个字符串,但打印出乱码的结果。谁能帮我吗?

int main () {       

    const char *a = "Hello\n";
    const char *b = "World\n";

    strncpy(&b, &a, strlen(a)); 
    printf("%s %s", a, b);  
    return 0;

}

我期待“Hello Hello”,但终端打印:

\
    Hello

即使 strncpy 的签名,GCC 也会打印关于 a 和 b 具有不兼容指针类型的警告:

char * strncpy(char *s1, const char *s2, size_t n)

要求 2 个字符指针。那是因为数组总是 char** 如https://stackoverflow.com/a/20213168中所述?

4

4 回答 4

3

两个问题:

  1. 您不应该复制到 指向的缓冲区const char *,因为它是一个常量缓冲区。
  2. 的参数strncpychar *s,但是你传递了char **,因此覆盖了指针本身,而不是它们指向的内容。
于 2014-03-18T19:10:04.997 回答
3

你在预期的地方通过char **了两次。char*

&b接受 a 的地址bb作为 achar*的地址char&b也是如此char **。出现同样的问题a


更新:

Just sawb不是一个数组,而是一个指向“字符串”字面量的指针。后者是恒定的,您无法更改它们,因此复制到文字的地址(代码实际上没有,因为&在 前面的 -operator 放错了位置b)必须失败。

b像这样绕过这个定义

char b [] = "World\n";

那是因为数组总是 char** [...]

数组不是总是char **”。

如果将数组作为参数传递给函数,则它会衰减为指向其第一个元素的指针。所以

char b[] = "test";

会衰减到

char * pb

pb指向`"test"的char 't'第一个字符。

于 2014-03-18T19:08:09.767 回答
2

编译您的代码-Wall以查看将告诉您如何解决此问题的警告。

于 2014-03-18T19:09:33.680 回答
2

两个问题:

1) 你应该使用strncpy(a, b, strlen(a)), if ais achar*ba const char*。您收到的编译器错误暗示了这一点。

2)你有未定义的行为。您已经分配了const char*字符串文字。编译器可能会将它们放在只读存储器中。并且不允许尝试修改其中任何一个:即使是单个元素更改也可能导致程序崩溃。

一种补救措施是使用char* b = malloc(/*ToDo - your size here*/);. 完成后记住free记忆。

于 2014-03-18T19:10:39.207 回答