5
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

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

かなり無害に見えますね。しかし、Dev-C ++である私のIDEは、次の警告を出します。警告:代入はキャストなしで整数からポインターを作成します

次のようにコードを変更すると、警告は消えます。

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

ここに画像の説明を入力してください

誰かが私がこれを説明するのを手伝ってもらえますか?

4

4 に答える 4

7

Dev-C++ を使用していますが、strdup は C または C++ 標準の一部ではなく、POSIX 関数です。ヘッダー ファイルで strdup を宣言するには、適切な (IDE のドキュメントに従って) プリプロセッサ シンボルを定義する必要があります。これは、ヘッダー ファイルが準拠する C またはC++ ソース ファイル。

シンプルなポータブルの代替手段については、検討してください

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

または、strdup が実際にライブラリにあることがわかっている場合は、その宣言を string.h から独自のソース ファイルまたはヘッダーにコピーするか、man ページのより単純な宣言を使用できます。

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 に答える