3

libgen.h の dirname を使用して、ファイル名のパスからディレクトリ パスを取得しています。

これは署名です:

char * dirname (char *path)

32 ビット マシンでコンパイルするか、gcc で -m32 を使用すると、すべて正常に動作します。

私のコードは次のようになります。

char* path = "/path/to/my/file.txt";
char* path_cpy = strdup(path);
const char* dir = (const char*)dirname(path_cpy);

64 ビット マシンでコンパイルすると、次の警告が表示されます。

"warning: cast to pointer from integer of different size"

これにより警告は修正されますが、実行時にクラッシュします。

const char* dir = (const char*)(uintptr_t)dirname(path_cpy);

以前に 32/64 ビット用にクロス コンパイルを試みたことはありません。これを修正する方法はありますか?

4

2 に答える 2

6

の定義を含むヘッダー ファイルをインクルードしていますかdirname(これlibgen.hは私のシステムにあります。チェックインし/usr/includeます)。

警告は、プロトタイプが定義されていない関数からのデフォルトの戻りコードである から"cast to pointer from integer of different size"キャストしているように聞こえます。int

32 ビット コードではデータ型intとデータ型は同じサイズですが、64 ビットに切り替えると、実際にはサイズが異なります。char *

印刷して、それらが異なるかどうかを確認することで、これを確認できsizeof(int)ますsizeof(char*)

于 2010-10-29T16:55:39.217 に答える
1

dirname(自分でインクルードまたはプロトタイピングすることによって)のプロトタイプを提供できなかったため、libgen.h暗黙的に type を取得しint dirname();ます。これは実際の関数と一致しないため、プログラムは未定義の動作をします。(この場合、ポインターの上半分が切り捨てられます。)

于 2010-10-29T16:57:20.370 に答える