这应该复制一个字符串但打印出乱码的结果。任何人都可以帮助我吗?
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
GCC打印一个关于a和b的警告,即使strncpy的签名具有不兼容的指针类型:
char * strncpy(char *s1, const char *s2, size_t n)
请求2个char指针。这是因为数组总是像https://stackoverflow.com/a/20213168中提到的那样?
答案 0 :(得分:3)
您要将char **
两次传递到预期char*
的位置。
&b
获取b
的地址,b
为char*
,地址为char
。因此&b
是char **
。 a
也会出现同样的问题。
<强>更新强>
刚看到b
不是一个数组,而是一个指向&#34;字符串&#34; -literal的指针。后者是不变的,你不能改变它们,所以复制到文字的地址(代码实际上做什么不,因为错误的&
- 运算符在frot的frot b
)必须失败。
要解决这个定义b
的问题
char b [] = "World\n";
这是因为数组总是char ** [...]
阵列不是&#34; 总是char **
&#34;。
如果一个数组作为参数传递给一个函数,它就会衰减到指向它的第一个元素。所以
char b[] = "test";
会腐烂到
char * pb
pb
指向char
't'
,第一个字符是&#34; test&#34;。
答案 1 :(得分:3)
两个问题:
const char *
指向的缓冲区,因为它是一个常量缓冲区。strncpy
的参数是char *
s,但是您传递了char **
,因此会覆盖指针本身,而不是它们指向的内容。答案 2 :(得分:2)
使用-Wall
编译代码,以查看告诉您如何解决此问题的警告。
答案 3 :(得分:2)
两个问题:
1)如果strncpy(a, b, strlen(a))
是a
而char*
是b
,则应使用const char*
。你得到的编译错误暗示了这一点。
2)您有未定义的行为。您已经分配了const char*
字符串文字。编译器可以将它们放在只读存储器中。并且不允许尝试修改它们中的任何一个:即使单个元素更改也可能导致程序崩溃。
一种补救措施是使用char* b = malloc(/*ToDo - your size here*/);
。一旦你完成了记忆,请记住free
。