C - strncpy()随机结果



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

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*应该通过。

&bb的地址,bchar*, char的地址。所以&b就是char **。同样的问题出现在a


更新:

刚才看到b不是一个数组,而是一个指向"字符串"字面量的指针。后者是常量,您不能更改它们,因此复制到文字的地址(代码实际做的是而不是,因为b前面的& -操作符放错了位置)必须失败。

要解决这个问题,可以这样定义b

char b [] = "Worldn";

是因为数组总是char**[…]

阵列不是总是char **"

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

char b[] = "test";

会衰变成

char * pb

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

两个问题:

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

-Wall编译你的代码,看到警告,将告诉你如何解决这个问题。

两个问题:

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

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

一个补救办法是使用char* b = malloc(/*ToDo - your size here*/);。记住,一旦你用完它,free内存

相关内容

  • 没有找到相关文章

最新更新