1

man ページによると、がstrerror(errnum)返されますchar *が、次の警告が表示されます。

gcc temp.c -o temp
temp.c: In function ‘mystrerror’:
temp.c:10:4: warning: return makes pointer from integer without a cast [enabled by default]

で実行するとセグメンテーション違反が発生しますが、で./temp 0はありません./temp 256

誰かがなぜこれが起こるのか、そしてそれを修正する方法を説明できますか (可能であれば)?

temp.c

#include <stdio.h>
#include <errno.h>

char *mystrerror(int errnum)
{
    switch (errnum) {
    case 256:
        return "My test";
    default:
        return strerror(errnum);
    }
}

int main(int argc, char **argv)
{
    int err;

    if (argc > 1) {
        err = atoi(argv[1]);
        printf("test error (%d) %s\n", err, mystrerror(err));
    }

    return 0;
}
4

2 に答える 2

4

strerror マンページによると、そのインクルードは#include <string.h>.

関数定義がないと、C はすべての関数が int を返すと想定するため、コンパイラ エラーが発生します。

于 2013-06-18T16:26:38.750 に答える
4

<string.h>ヘッダー ファイルが含まれていません。

ドキュメンテーション。

コンパイラは、問題が正確に何であるかを教えてくれます。

return は、キャストなしで整数からポインターを作成します

関数のプロトタイプが存在しない場合は、 を返すと見なされintます。そして、あなたのプラットフォームでは、へのポインターが にchar収まらないintため、切り捨てられ、printf()無効なポインターを逆参照しようとするようです。

于 2013-06-18T16:26:56.267 に答える