5
#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++,给了我以下警告:警告:赋值从整数中生成指针而不进行强制转换

如果您像这样更改代码,警告就会消失:

char *s;
s = (char*)strdup("foo");

在此处输入图像描述

谁能帮我解释一下?

4

4 回答 4

7

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

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

char* mystrdup(const char* s)
{
    char* p = malloc(strlen(s)+1);
    if (p) strcpy(p, s);
    return p;
}

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

char *strdup(const char *s);
于 2012-11-16T06:04:40.253 回答
6

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

#include <string.h>
于 2012-11-16T05:43:15.627 回答
1

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

于 2012-11-16T05:44:25.220 回答
1

man strdup

你会得到以下的东西

#include<string.h>

char* strdup(const char * s);

所以strdup()返回char*那里应该没有任何问题实际上在你的情况下它需要隐式声明strdup()所以默认返回类型是int因此你得到这个警告

任何一个include<string.h>

或者

提前声明char* strdup(const char *);

也不要忘记free(s)在所有使用完成后最后

于 2012-11-16T05:45:32.770 回答