首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >strncpy()随机结果

strncpy()随机结果
EN

Stack Overflow用户
提问于 2014-03-18 19:07:18
回答 4查看 168关注 0票数 0

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

代码语言:javascript
运行
复制
int main () {       

    const char *a = "Hello\n";
    const char *b = "World\n";

    strncpy(&b, &a, strlen(a)); 
    printf("%s %s", a, b);  
    return 0;

}

我希望“你好”,但终端打印:

代码语言:javascript
运行
复制
\
    Hello

GCC打印关于a和b具有不兼容指针类型的警告,即使strncpy的签名:

代码语言:javascript
运行
复制
char * strncpy(char *s1, const char *s2, size_t n)

请求两个字符指针。这是因为数组总是char**,就像https://stackoverflow.com/a/20213168中提到的那样?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-03-18 19:08:09

在期望char **的情况下,您将通过两次char*

&b接受b的地址,bchar*char的地址。所以&bchar **。同样的问题出现在a上。

更新:

刚才看到的b不是数组,而是指向"string"-literal的指针。后者是常量,您不能更改它们,所以复制到一个文字的地址(代码实际上做的是而不是,因为&-operator在b中放错了位置)必须失败。

要绕过这个问题,请像这样定义b

代码语言:javascript
运行
复制
char b [] = "World\n";

因为数组总是char** .

数组不是“总是char **”。

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

代码语言:javascript
运行
复制
char b[] = "test";

会腐烂成

代码语言:javascript
运行
复制
char * pb

使用pb指向“char 't'”,这是“测试”的第一个字符。

票数 3
EN

Stack Overflow用户

发布于 2014-03-18 19:10:04

两个问题:

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

Stack Overflow用户

发布于 2014-03-18 19:09:33

使用-Wall编译代码以查看警告,这些警告将告诉您如何解决这个问题。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22488764

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档