strncpy()随机结果

时间:2014-03-18 19:07:19

标签: c strncpy

这应该复制一个字符串但打印出乱码的结果。任何人都可以帮助我吗?

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中提到的那样?

4 个答案:

答案 0 :(得分:3)

您要将char **两次传递到预期char*的位置。

&b获取b的地址,bchar*,地址为char。因此&bchar **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)

两个问题:

  1. 您不应该复制到const char *指向的缓冲区,因为它是一个常量缓冲区。
  2. strncpy的参数是char * s,但是您传递了char **,因此会覆盖指针本身,而不是它们指向的内容。

答案 2 :(得分:2)

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

答案 3 :(得分:2)

两个问题:

1)如果strncpy(a, b, strlen(a))achar*b,则应使用const char*。你得到的编译错误暗示了这一点。

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

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