ミスチルの大名曲の数々が配信決定!! 31日間無料!!【PR】

struct in_addr A;
(struct in_addr)型のAがありまして、Aにデータを代入するとき、よく
A.s_addr = ?????;
というように、「s_addr」というメンバにアクセスしてるサンプルをよく見かけますが、MSDNライブラリによると、

typedef struct in_addr {
union {
struct {
u_char s_b1,s_b2,s_b3,s_b4;
} S_un_b;
struct {
u_short s_w1,s_w2;
} S_un_w;
u_long S_addr;
} S_un;
} in_addr;

となっていて、「s_addr」のメンバはどこにもないんですよね。。
これはどういうことなんでしょう。
ちなみに自分の発想でアクセスするとしたら、例えばu_longとしてだったら、
A.S_un.S_addr
というようなものしか思いつきません。

あと、ネットワークプログラミング初心者の自分にもわかるような、WinSockについてやさしく、しかもくわしいサイトやおすすめの書籍がありましたら、是非とも教えてください。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

bcc32のwinsonk.hをみたら



#define s_addr S_un.S_addr

のようになっていました。
A.S_un.S_addr
って打つのが面倒くさいってことでしょうね。
    • good
    • 0
この回答へのお礼

本当ですね。。
すみません、調べたはずが、見逃してました。
しかしs_addrの表現だと頭がこんがらかるような気がしてなりません。。

どうもありがとうございます。

お礼日時:2005/04/04 09:50

有名どころで”ねこでもわかる”のサイト


http://www.kumei.ne.jp/c_lang/intro/no_91.htm

もうひとつ有名どころで”wisdomsoft”のサイト
http://wisdom.sakura.ne.jp/system/winapi/winsock …

書籍だと”ねこでもわかる”の”ネットワークプログラミング”の本がTCPやUDP通信について詳しかった.

これらは,プログラミングの基本的なことでもとてもお世話になっています.
    • good
    • 0
この回答へのお礼

アドバイスどうもです。
しかしながら、どちらのサイトも、すでに知っていたのでした。

猫のほうは、昔から知っているのですが、出だしにはあまりむかないと思います。。サンプルソースばかりで、途中の”細かい”解説がないように思えます。入門者にとっては必要です(ええ)。ここが有名なのは、「幅広い知識を扱っている」からですし。

萌えゲー用語ばかり使っているほうのサイトは、WinAPI関数編では解説が丁寧だったのが、WinSock編では読者のレベルが高いと想定してか、表現からして難しく感じます。

高望みをしているのかもしれませんが、これらの有名所よりも仕様説明が丁寧な場所を探しています。。

最近見つけたところだと
http://www.mars.dti.ne.jp/~torao/program/
とかあります。
有名であれば必ずしもいいというわけではないと思うので、WinSockだけにこだわったようなサイトはないでしょうか。

お礼日時:2005/04/04 09:59

winsonk.hになってしまいました:-)


winsock.hの間違いです。

サイト・書籍はわかりません、
winsock関連の本は一応もってますが、かなり古いし・
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qsocket: recvはいつ,どれだけ受け取るのか?

 現在,参考書にしたがってC++でソケットプログラミングを書いています.

 sendとrecvを非同期にするために,本では select関数やWSAAsyncSelect関数などを利用していて,実際,本のとおりに書いて上手く動いています.

 ここで伺いたいのですが,recvは,どうやって「データが届いたか」を知るのでしょうか.

 同期ならば,トランシーバでの会話のように送信側が「どうぞ」といって送受信を交代させることができますが,非同期ならばそれができません.

 NICとかが,プログラムに「届いたぞ!( or これから届くぞ!)」と教えてくれるのでしょうか.あるいは逆に,プログラムがNICに「届いてる?」と聞いているのでしょうか.仮に,ここに書いたような方法で届いたことが分かったとしても,どれくらい受け取ればいいかは分かりません(それも併せて教えてもらっているのでしょうか.データを送るときには,どれだけ送ればいいか分かりますよね.受信するときはどうしてるのかを知りたいと思っています).

Aベストアンサー

Linux しか知らないので Linux で説明をします。

NIC が通信パケットを受け取ると割り込みが発生し、CPU は割り込みを受け付けて、対応するデバイスドライバを起動します。この時、ドライバはソケットバッファと呼ばれる構造体にパケットの中身をコピーして、Linux カーネルの本体に渡し、そこで TCP 等の上位プロトコル処理が行われます。

一方、ユーザプログラムの方は、 select() なり read() で待っている訳ですが、OS はもちろんプロセスが何を待っているかを知っているので、対応する待ちの条件が満たされると、この場合は select() や read() が、抜けてくる(return する)訳です。

という事で、ユーザのプログラムは select() なり read() なりで受信データを「待つ」ことが必要です。もちろん select() や read() が呼ばれた時点で既に受信しているのならば、それらは直ぐに帰ってきます。read() や recv() はデータが届いた事を知る、というよりは、届いているかチェックして、まだ届いていなければ届くまで待つ(read() が抜けてこない)という処理になります。また NIC とユーザプログラムが直接やり取りをするのではなく、間にバッファがあって、対応するソケットのデータがある(受信済み)/ないか(未受信)、という問い合わせを行っているだけです。

ソケットの場合、データの送受信は非同期であり、送受信のタイミングのずれは(ソケット)バッファである程度吸収されます。もちろん、送受信バッファが満杯になった場合は流量制御が働いて、結果的に送信側の write() や send() が待ちに入ることになります。

Linux (Unix) のソケットの受信では、read() 等で指定されたバッファが常に満杯で返されるとは限らない設計になっています。つまり、その時に受信しているデータを返すだけなので、read() で返されたバイト数を必ず見ないと間違った動きになるので注意してください。

Linux しか知らないので Linux で説明をします。

NIC が通信パケットを受け取ると割り込みが発生し、CPU は割り込みを受け付けて、対応するデバイスドライバを起動します。この時、ドライバはソケットバッファと呼ばれる構造体にパケットの中身をコピーして、Linux カーネルの本体に渡し、そこで TCP 等の上位プロトコル処理が行われます。

一方、ユーザプログラムの方は、 select() なり read() で待っている訳ですが、OS はもちろんプロセスが何を待っているかを知っているので、対応する待ちの条件が満...続きを読む

QDWORDの実際の型は何でしょうか

VC++.NETの環境です。
DOWRD dw1 = 1;
int i = 2; と定義し
ここで
if ( i > dw1 ){
何かの処理;
}
とコーディングすると
warning C4018: '>' : signed と unsigned の数値を比較しようとしました。
のワーニングがでます。
これは、DWORDがint型でなくunsigned int型のようにも見えます。
ある本によれば(VC++.V.NET逆引き大全500の極意)
DWORD はint型であると記述されています。
もし、int型ならこのワーニングはでないはずなのですが、
なぜでるのでしょうか。又、DWORDの実際の型は何なのでしょうか。ご存じのかたおりましたら、教えていただけませんでしょうか。

Aベストアンサー

型定義が知りたいのならば、宣言ファイルを見れば疑問を挟む余地もありません。
DWORD型はwindef.hで
"typedef unsigned long DWORD;"
と宣言されています。

Visual Studioを使っているのならば、知りたい型の上にマウスポインタを置いて右クリック、ポップアップメニューの「定義へ移動」または「宣言へ移動」で簡単に知ることが出来ます。

QIPアドレスとMACアドレスを取得したい(C言語)

OSはLinuxで、コンパイラはgccです。
C言語でプログラムを作っていて、自分のIPアドレスとMACアドレスを取得しようと考えています。下のソースでIPアドレスは入手できたのですが、MACアドレスも取得しようとしたら、IPアドレスが上手く取得できなくなりました。ioctl(fd, SIOCGIFHWADDR, &ifr);で取得できるとおもうのですが、同時に取得しようとするとIPアドレスの表示が正しくされなくなっている状況です。

/* 自IPアドレスの取得 */
int fd;
struct ifreq ifr;
fd = socket(AF_INET, SOCK_STREAM, 0);
ifr.ifr_addr.sa_family = AF_INET;

/* eth0のIPアドレスの取得 */
strncpy(ifr.ifr_name, "eth0", IFNAMSIZ-1);
ioctl(fd, SIOCGIFADDR, &ifr);
/* MACアドレスの取得 */ ←上書きされている??
ioctl(fd, SIOCGIFHWADDR, &ifr);
close(fd);

どなかたご教授お願いいたします。

OSはLinuxで、コンパイラはgccです。
C言語でプログラムを作っていて、自分のIPアドレスとMACアドレスを取得しようと考えています。下のソースでIPアドレスは入手できたのですが、MACアドレスも取得しようとしたら、IPアドレスが上手く取得できなくなりました。ioctl(fd, SIOCGIFHWADDR, &ifr);で取得できるとおもうのですが、同時に取得しようとするとIPアドレスの表示が正しくされなくなっている状況です。

/* 自IPアドレスの取得 */
int fd;
struct ifreq ifr;
fd = socket(AF_INET, SOCK_STREAM,...続きを読む

Aベストアンサー

/usr/include/linux/if.h にある struct ifreq の定義を良く見て貰えば分かると思いますが、ifr_ifru は union です。で、その union の中に ifru_addr と ifru_hwaddr があり、これが ifr_name と ifr_hwaddr に #define で定義されています。つまり union なのでこれらは同じ領域を取ります。

ということで、IPアドレスを取得後に自分で確保した struct sockaddr_in の変数に内容をコピーしておいてそれからMacアドレスを取得するか、または最初から strut ifreq ifr1, ifr2; のように2つ変数を作っておいて別々に取得すればいいと思います。

Qin_addrからchar型の文字列の変換

Cでネットワークプログラミングの勉強をしているのですが
IPアドレスをin_addr型で保存しています。
IPアドレス、具体的には「192.168.0.1」というのをchar型の配列で
ip[0]="192"
ip[1]="168"
ip[2]="0"
ip[3]="1"
と言う風に変えたいのですが何か関数を使って出来ないでしょうか。
in_addr型をchar型でキャストした場合は
ip[0]="1"
ip[1]="9"
ip[2]="2"
と言うような感じになってしまいました。
よろしくお願いします。

Aベストアンサー

ip[0]="192"
という風に変えたいと書かれておりますが、ip[]というのはどう宣言されているのでしょうか。
char ip[32];
のように宣言されているのなら、それはあくまでも「charの配列」なので、ip[0]には一つのcharしか代入できず、
ip[0]="192"
という形で入れることはできません。大きさが4つの配列で実現するなら、
ip[0]=192
という形で文字列でなくunsigned char型の数値として代入するか、
char ip[4][4];
のように「文字列の配列」つまり「charの配列の配列」と宣言しないといけません。

文字列として'.'を抜いたそれぞれの値を取り出したいのなら、in_addr型の変数をinとすると、inet_ntoa()を使って、
char *ip[4];
char ip_str[16];
と宣言しておき、
strcpy(ip_str,inet_ntoa(in));
ip[0] = strtok(ip_str,".");
ip[1] = strtok(ip_str,NULL);
ip[2] = strtok(ip_str,NULL);
ip[3] = strtok(ip_str,NULL);
とすればいいのではないでしょうか。

参考URL:http://www.linux.or.jp/JM/html/LDP_man-pages/man3/inet.3.html

ip[0]="192"
という風に変えたいと書かれておりますが、ip[]というのはどう宣言されているのでしょうか。
char ip[32];
のように宣言されているのなら、それはあくまでも「charの配列」なので、ip[0]には一つのcharしか代入できず、
ip[0]="192"
という形で入れることはできません。大きさが4つの配列で実現するなら、
ip[0]=192
という形で文字列でなくunsigned char型の数値として代入するか、
char ip[4][4];
のように「文字列の配列」つまり「charの配列の配列」と宣言しないといけません。

文字...続きを読む

QをVisualStudioでつかえるようにする

<unistd.h>をVisualStudioでつかえるようにしたいのですが、問題なくコンパイルできるようにするにはどうしたらいいでしょうか?

CygwinというやつをインストールしてやってみたのですがやはりVisualStudioだけでコンパイルしてやりたいのですが。。。。

Aベストアンサー

おそらく<unistd.h>をフルスペックで利用したいわけではないと思います。その中の一部の関数を使いたいだけなら<io.h>などで代用できるはずですから、ヘルプで調べてみることをお勧めします。

ソースを修正せずに、コンパイル&実行ができるようにすることは諦めた方がよいと思います。

移植のことを考えるなら、<unistd.h>とか<windows.h>のような環境に特化したヘッダや、そこで宣言される型や関数などを直接使うのではなく、適切にラッピングしてから使う方が後々楽です。今回は仕方ないでしょうが、今後はそうしましょう。

Q初級者の質問――time_tについて

私はC言語の初級者です。

time関数というのは現在時刻をtime_t型で返すものですよね。
でも、私はこの意味がよくわかりません。

time_t型とは何でしょうか。

単なる整数なのでしょうか。
確か、time_t型というのは整数で、
1970年1月1日0時からの秒数(世界標準時)だと聞いた気がします。

しかし、(いくつか見てみましたが)大抵のC言語の本では、そういう説明はしていません。
「プログラミング言語C」(カーニハン、リッチー)という本では、
「timeは現在のカレンダー時間を返す。」
と説明しています。
「じゃあ、カレンダー時間って何?」と思いますが、「カレンダー時間」というものの説明は見当たりません。

time_tというのは整数と考えてよいのでしょうか。
time_tで変数宣言すると、プログラムを読む人が「あ、これは時間を表すんだな」とわかり易いから、time_tというものがあるのでしょうか。

それとも、
time_tが秒数を表すかどうかは処理系に依存するのでしょうか。

もし、1970年1月1日からの秒数を表すなら、time関数の戻り値を1年間の秒数で割って1970に足せば今何年かわかるプログラムになりそうですよね。(うるう年や時差は考慮する)
それとも、それは処理系によっては正しく動かないプログラムになるのでしょうか。
(あくまでも考え方です。確か、time_tを渡せば年月日時分秒を返す関数があると思います。)



ちなみに、おとといプログラムを作ってtime関数の戻り値を10進数で表示すると次のようになりました。(VC++)


==============プログラム==============

#include <stdio.h>
#include <time.h>

int main(void)
{
time_t a;
a=time(NULL);
printf("%d\n",a);

return(0);
}

================結果===============

1005300371

私はC言語の初級者です。

time関数というのは現在時刻をtime_t型で返すものですよね。
でも、私はこの意味がよくわかりません。

time_t型とは何でしょうか。

単なる整数なのでしょうか。
確か、time_t型というのは整数で、
1970年1月1日0時からの秒数(世界標準時)だと聞いた気がします。

しかし、(いくつか見てみましたが)大抵のC言語の本では、そういう説明はしていません。
「プログラミング言語C」(カーニハン、リッチー)という本では、
「timeは現在のカレンダー時間を返す。」
と...続きを読む

Aベストアンサー

> C99とは、ISOの規格で比較的新しいものと思います。

そうです。
正式にはISO/IEC 9899:1999です。

> (C98というのは知りませんでした。)
失礼しました。
C89の間違いです。
同様にISO/IEC 9899:1989です。

> しかし、時間の起点が2000年1月1日であっても、秒数でなくて日数であっても、かまわないのでしょうか
時間の起点(というか、時間の管理方法)は time()の管轄であり、型であるtime_tは「time()が返す値を表現できること」が要求されているに過ぎません。
また、「1970年1月1日0時0分0秒からの経過秒数」というのは慣例に過ぎません。

とはいえ、UNIXを起源とする『time_tはlong』と『time()は1970年1月1日0時0分0秒からの経過秒数』という約束事は変えられる事は無いでしょう。
C98/C89との互換性を保ちながら新規格を作ることが予想されるからです(そうでなければlong longなどという型は作らないはず)。
その意味でyoushirさんのおっしゃるとおりだと思います。

> C99とは、ISOの規格で比較的新しいものと思います。

そうです。
正式にはISO/IEC 9899:1999です。

> (C98というのは知りませんでした。)
失礼しました。
C89の間違いです。
同様にISO/IEC 9899:1989です。

> しかし、時間の起点が2000年1月1日であっても、秒数でなくて日数であっても、かまわないのでしょうか
時間の起点(というか、時間の管理方法)は time()の管轄であり、型であるtime_tは「time()が返す値を表現できること」が要求されているに過ぎません。
また、「1970年1月1日0...続きを読む

Qソケット通信内 read関数について

現在C言語にソケット通信を作成しているのですが、read関数内の作成でつまずいています。
ご存知でしたら教えてください。

自分なりに調べた結果read関数の戻り値は受信した
バイト数、毎回指定サイズ受け取るとは限らないと
いうことでした。

そこでread関数を無限ループで回し
指定サイズ受信したら、ループを抜ける使用にしたのですが、受信バイトが0だった場合はどうすればよいのでしょか?
よくサンプルなどでは、0だったらエラーと判断し、すかさずbreakしているのですが、一度でも0バイトを受信すると、それ以降は1バイト以上受信出来ないものなのでしょうか?
もし出来ないのなら一度でも0を受信したら、breakしようと思っています。
出来るのでしたら、タイマー設定をし、指定受信バイトに満たなくても一定時間が過ぎたらループから抜ける使用にしたいと考えています。
そのほか良い方法があれば教えてください。

分かりずらい説明になってしまいましたが、宜しくお願い致します。

Aベストアンサー

selectの戻り値が1となったのならば一歩前進です。
あとは、FD_ISSET()して期待通りのソケット番号にデータきていれば受信できると思います。

ところで今回のソースでFD_SET()のところはどうなっていますか?
selectでいつも0となるのはFD_SETがちゃんとできていないような気がします。
前回と今回のソースで差分をチェックしてみてはどうでしょうか。

がんばってください!


あと、ほかに参考になりそうなページをのせてみます。
「selectを使う」の項目が役立ちそうです。fdという変数にaccept()した戻り値を入れるようにすればいけます。

参考URL:http://www.ops.dti.ne.jp/~allergy/socket/socket.html

QLNK2019: 未解決の外部シンボルのエラーが出る

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自キャラのデータ
Point2D g_jikipos = {40, 400};//自キャラの座標

//画像ハンドル
int g_jikiimage[11];

//色々なファイルの読み込み
int LoadFiles(){
//画像ファイル読み込み
if(LoadDivGraph("media\\player01.bmp",
11,11,1,64,64,g_jikiimage) == -1) return -1;

return 1;
}


 mymain.h
//他から呼び出させるMyMainの関数
void MyMain();
int LoadFiles();


 myhelper.h(サンプルなので打ちミスはない)
#include "DxLib.h"
#include <limits.h>
#include <math.h>

//構造体宣言
//座標またはベクトルを記録する構造体
struct Vector{
float x,y;
};
typedef Vector Point2D;
//線を記録する構造体
struct Line2D{
Point2D startpos, endpos;
float katamuki;//傾きをラジアン値で記録
Vector speed;//移動している場合は速度をセット
};
//球体を記録する構造体
struct Ball2D{
Point2D position;
float hankei;//半径
};
//四角形を記録する構造体
struct Rect2D{
Point2D lefttop;
Point2D rightbottom;
float width;
float height;
};


//ライブラリ関数
Point2D PosInView(Point2D in);
int XInView(float inx);
int YInView(float iny);
void ScrollToLeft(float jikiposx);
void ScrollToRight(float jikiposx);
void ScrollToUp(float jikiposy);
void ScrollToDown(float jikiposy);
void DrawLineInView(float x1, float y1, float x2, float y2, int Color, int Thickness);
void DrawCircleInView(float x, float y, float r, int Color, int FillFlag);
void DrawAnimation(float x, float y, double ExtRate, double Angle,int TurnFlag,
int *imgarray, int allframe, float fps);
//ベクトル関数
Vector CreateVector(Vector in, float veclen);
Vector AddVector(Vector v1, Vector v2);
Vector SubVector(Vector v1, Vector v2);
Vector AddVectorInFrameTime(Vector pos, Vector speed);
Vector AddVectorInFrameTime2(Vector pos, Vector speed, Vector accel);
Vector Normalize(Vector in);
Vector RotateVector(Vector in, float radian);
float VectorLengthSquare(Vector in);
float DotProduct(Vector v1, Vector v2);
float CrossProduct(Vector v1, Vector v2);
void SetLine2DKatamuki(Line2D *in);
void DrawLine2D(Line2D in, int Color, int Thickness);
void DrawBall2D(Ball2D in, int Color, int Fill);
//当たり判定関数
bool HitTestLineAndBall(Line2D linein, Ball2D ballin);
bool IsPointAtLineFace(Line2D linein, Point2D ptin);
bool HitTestLineAndLine(Line2D line1, Line2D line2);
bool HitTestBallAndBall(Ball2D a, Ball2D b);
bool HitTestPointAndBox(Rect2D rect, Point2D pt);
//タイマー関数
void SetSimpleTimer(int idx, int time);
int GetPassedTime(int idx);


//グローバル変数
extern float g_frametime;
extern Rect2D g_framerect;//画面領域(当たり判定)
extern Point2D g_current_field_pos;//現在の左上座標
extern Rect2D g_stagesize;//ステージサイズ

//定数宣言
const float ZEROVALUE = 1e-10f;
const float PIE = 3.1415926f;
const int SCROLL_LIMIT = 200;
----------------------------------------------------------------
 エラー内容
1>myhelper.obj : error LNK2019: 未解決の外部シンボル "void __cdecl MyMain(void)" (?MyMain@@YAXXZ) が関数 _WinMain@16 で参照されました
1>C:\Documents and Settings\Owner\My Documents\Visual Studio 2008\Projects\my\Debug\my.exe : fatal error LNK1120: 外部参照 1 が未解決です
1>my - エラー 2、警告 0
ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ
----------------------------------------------------------------
画像を貼り付けときます
(見えにくい場合→http://www.dotup.org/uploda/www.dotup.org154142.jpg.html)
初心者なのでわかりやすくお願いします

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自...続きを読む

Aベストアンサー

ファイル構成から推測するに
mymain.cpp というファイルに
void MyMain(void) {
// ここに処理を書く
}
という関数が必要なようです。

Qソケットのrecvの戻り値が0

linuxにてソケットの勉強をしようと思い、
簡単なソケット通信のプログラムをCで組みました。

ret = recv(ID, Buff, sizeof(Buff), 0);

といった感じでサーバ側を組んだのですが、
この戻り値retに0が入ることがあり、思うように動いてくれません。

私の認識だと、recvは受信するまで待ち、
受信したサイズを返すと思っているのですが、
それが0とは、いったいどういう意味を持つのでしょうか?

Aベストアンサー

recv()の切断時の返り値は-1とは限りません。
むしろ、通常の切断では0以上が返ると思ってください。
つまり、recv()の返り値だけで切断を検出することは出来ません。

単純に1回の接続で短いデータを1回受信するだけのような場合はrecv()が返ってきた時点で切断されていると見なすことは出来るでしょう。

通常は、プロトコルで切断手順を定めて、切断することがプログラムで分かるよう工夫します。
例えば、終了時には必ず"EOF"という行を送るようにする、等です。

しかし、クライアントが強制終了した場合などは上記方法では対応できないので、alarm()を用いて一定時間通信がなければ自動終了するようにするなどしてタイムアウトを定めるわけです。
もちろん、可能ならばクライアント側で強制終了時もシグナルを拾って切断手順を実行できるようにすることも大事です。

Qfopne で失敗する原因

fopenで失敗する原因とはなんですか?

Aベストアンサー

#1の方の回答に加えて...

・ファイル名の文字列がでたらめ(存在するかどうか以前の問題)
・指定したファイル名が実はディレクトリだった。
・ファイル名に空ポインタまたは不正なポインタを渡した。
・オープンモードに空ポインタまたは不正なポインタを渡した。
・オープンモードの形式が不正
・メモリ不足でバッファ(実装によってはファイル記述子も)の割り付けに失敗した。
・同名の関数またはマクロをユーザーが定義した。
・関数原型なしで呼び出した。
・他のスレッド等で、同じファイルに対する操作中(再入可能とは限らないので)


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング