这应该会复制一个字符串,但会打印出混淆的结果。有人能帮我吗?
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
GCC打印关于a和b具有不兼容指针类型的警告,即使strncpy的签名:
char * strncpy(char *s1, const char *s2, size_t n)
请求两个字符指针。这是因为数组总是char**,就像https://stackoverflow.com/a/20213168中提到的那样?
发布于 2014-03-18 19:08:09
在期望char **
的情况下,您将通过两次char*
。
&b
接受b
的地址,b
是char*
,char
的地址。所以&b
是char **
。同样的问题出现在a
上。
更新:
刚才看到的b
不是数组,而是指向"string"-literal的指针。后者是常量,您不能更改它们,所以复制到一个文字的地址(代码实际上做的是而不是,因为&
-operator在b
中放错了位置)必须失败。
要绕过这个问题,请像这样定义b
char b [] = "World\n";
因为数组总是char** .
数组不是“总是char **
”。
如果将数组作为参数传递给函数,则它会衰减到指向其第一个元素的指针。所以
char b[] = "test";
会腐烂成
char * pb
使用pb
指向“char
't'
”,这是“测试”的第一个字符。
发布于 2014-03-18 19:10:04
两个问题:
const char *
指出的缓冲区,因为它是一个常量缓冲区。strncpy
的参数是char *
的,但是您传递了char **
,从而覆盖了指针本身,而不是它们指向的内容。发布于 2014-03-18 19:09:33
使用-Wall
编译代码以查看警告,这些警告将告诉您如何解决这个问题。
https://stackoverflow.com/questions/22488764
复制相似问题