首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >strdup的用法

strdup的用法
EN

Stack Overflow用户
提问于 2012-11-16 13:40:34
回答 4查看 11.4K关注 0票数 5
代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{    
    char *s;
    s = strdup("foo");
    printf("%s\n", s);
    getchar();
    return 0;
}

看起来很无害,不是吗?但是我的IDE,也就是Dev-C++,给出了以下警告:警告:赋值使指针从整型变为无类型转换

如果您按如下方式更改代码,则该警告将消失:

代码语言:javascript
复制
char *s;
s = (char*)strdup("foo");

有人能帮我解释一下吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-11-16 14:04:40

您正在使用Dev- C++,但是strdup不是C或C++标准的一部分,它是一个POSIX函数。您需要定义适当的预处理器符号(根据IDE的文档),以便头文件声明strdup ...这是必要的,以便头文件在包含到符合C或C++标准的源文件中时不会污染名称空间。

对于简单的便携替代方案,请考虑

代码语言:javascript
复制
char* mystrdup(const char* s)
{
    char* p = malloc(strlen(s)+1);
    if (p) strcpy(p, s);
    return p;
}

或者,如果你知道strdup实际上在库中,你可以将它的声明从string.h复制到你自己的源文件或头文件中……或者使用手册页中更简单的声明:

代码语言:javascript
复制
char *strdup(const char *s);
票数 7
EN

Stack Overflow用户

发布于 2012-11-16 13:43:16

那是不对的。strdup已经返回了char *。还有一些地方不对劲。可能是因为您没有包含正确的头文件来声明此函数的真正返回类型。

代码语言:javascript
复制
#include <string.h>
票数 6
EN

Stack Overflow用户

发布于 2012-11-16 13:44:25

你要错过#include <string.h>了。在没有函数签名的情况下,编译器假定strdup返回一个int,因此出现警告。

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

https://stackoverflow.com/questions/13411125

复制
相关文章

相似问题

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