这应该复制一个字符串,但打印出乱码的结果。有人能帮我吗?
int main () {
const char *a = "Hellon";
const char *b = "Worldn";
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中提到的数组总是char**吗?
你通过了两次char **
,而char*
应该通过。
&b
取b
的地址,b
为char*
, char
的地址。所以&b
就是char **
。同样的问题出现在a
。
更新:
刚才看到b
不是一个数组,而是一个指向"字符串"字面量的指针。后者是常量,您不能更改它们,因此复制到文字的地址(代码实际做的是而不是,因为b
前面的&
-操作符放错了位置)必须失败。
要解决这个问题,可以这样定义b
char b [] = "Worldn";
是因为数组总是char**[…]
阵列不是总是char **
"。
如果将数组作为参数传递给函数,则该数组将衰减为指向其第一个元素的指针。所以
char b[] = "test";
会衰变成
char * pb
pb
指向char
't'
,即' "test"的第一个字符。
两个问题:
- 你不应该复制到
const char *
指向的缓冲区,因为它是一个常量缓冲区。 -
strncpy
的参数是char *
s,但是您传递了char **
,因此覆盖了指针本身,而不是它们指向的内容。
用-Wall
编译你的代码,看到警告,将告诉你如何解决这个问题。
两个问题:
1)如果a
是char*
, b
是const char*
,你应该使用strncpy(a, b, strlen(a))
。你得到的编译错误暗示了这一点。
2)你有未定义行为。您已经分配了const char*
字符串字面值。编译器可以把它们放在只读内存中。并且试图修改它们中的任何一个都是不允许的:即使是单个元素的更改也可能导致程序崩溃。
一个补救办法是使用char* b = malloc(/*ToDo - your size here*/);
。记住,一旦你用完它,free
内存