
こんにちは。
ファイルオープンし、fread関数にて1バイトずつ1024個をPktBuf配列へ格納し、sendto(winsock関数でUDPソケットの関数です)で1024Byteずつ送信しています。
#define DATA 1024
FILE *fp;
char PktBuf[1024]
fp = fopen(SEND_FILE_NAME,"rb+");
while((n = fread(PktBuf,1,DATA,fp)) != 0) {
sendto
}
fread(PktBuf,1,DATA,fp)の第2引数で、1と指定しているのですが・・・HPを参考にしているとsizeof(int)やsizeof(char)などが明記されている場合があるのですが、これは移植性を気にする場合に必要なことなのでしょうか?
もし、第2引数のところを1から2へ変更した場合、2Byte×1024個=2048Byteとなり、配列[1024]に格納できないことを意味するのでしょうか?
最後に、fread関数およびmallocまたはcalloc関数を用いた、動的なメモリ確保について勉強しているのですが、記述方法がわからない状態です・・・現在の記述方法で問題はないのですが、動的なメモリ確保をすることが定説?と書かれていましたので、そちらも知りたいと思っています。
よろしくお願いします。
A 回答 (1件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
freadの第2引数は読み込むバッファの形式にあわせるようにするのが一般的だと思います
バッファを intでっとってあるならば sizeof(int)
charでとっているのであれば sizeof(char)
といった具合です
freadはバッファへ読み込むデータを 第2引数で指定された項目を 第3引数で指定された個数分読み込むように設計されています
ご質問のように fread( PktBuf, 2, DATA, fp ) といった具合に変更してしまうと PktBufが 1024バイトしか確保していないのに
2048バイト読み込んでもいいよといったことになり
1024バイト以降データは PktBufとは関係無い領域に書き込まれます
となると 別の変数やスタックなどを破壊して 異常終了といった事態を招きます
mallocやcallocなどは ポインタを返す関数ですので まず受け取るポインタ変数を宣言します
callocは2つの引数をとります 項目数と項目のサイズです
mallocは確保したい領域のサイズを引数とします
1024バイトのバッファなら
// char型バッファ
char *pBuf = NULL;
pBuf = (char*)calloc(1024, sizeof(char));
pBuf = (char*)malloc(1024);
// int型バッファ
int *piBuf = NULL;
piBuf = (int*)calloc(1024, sizeof(int));
piBuf = (int*)malloc(1024*sizeof(int));
動的に確保した場合は free()を使って必ず開放するようにしましょう
free(LPVOID)pBuf);
free((LPVOID)piBuf);
といった具合です
#まず、お使いのCコンパイラのヘルプなどをお調べになることをお勧めします
この回答への補足
返信ありがとうございます。
以下のように記述してみました。
#define SEND_DATA_SIZE 1024
int A_func{
//pBufを動的割り当て
char *pBuf=NULL;
pBuf = (char*)malloc(SEND_DATA_SIZE);
//fread関数にて
while((n = fread(pBuf, sizeof(char), SEND_DATA_SIZE, fp)) != 0) {
sendto
}
}
このように記述することで、動的なメモリ割り当てが行われているのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
allocってなんですか?
-
c言語のポインタへの文字列入力...
-
構造体でchar name[]と*nameの...
-
win32APIのHeapAlloc()の使い方...
-
プログラムが途中で強制終了し...
-
配列の添え字の最大数とは?
-
VB.netでのwin32api呼び出し
-
64ビットと32ビットの違い
-
bool と BOOL の違い(構造体)
-
MSDNがgethostbynameではなくge...
-
実行ファイルのメモリ上のアド...
-
メモリ不足になってしまう。
-
c言語のメモリの確保について
-
配列を使わずに、変数名を動的...
-
関数から配列を返すには?
-
Integer変数をカラにしたいので...
-
構造体のデータを丸ごとコピー...
-
【速いブラインドタッチ】手を...
-
char*を初期化したいのですが
-
DelphiでCreateProcessがうまく...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
c言語のポインタへの文字列入力...
-
allocってなんですか?
-
ビットをローテートするプログ...
-
ヒープメモリの解放について
-
newしないオブジェクトについて
-
ポインタのポインタの初期化法
-
構造体でchar name[]と*nameの...
-
行列内の行の交換,列の交換を...
-
C++で、メンバもヒープに確保さ...
-
配列の添え字の最大数とは?
-
DLLのマルチスレッドの動作につ...
-
C++のnewで確保したメモリーの...
-
mallocで確保するメモリの領域...
-
C言語に関する質問
-
Win32APIでのメモリ管理について
-
変数に文字列を代入する方法を...
-
CreateFileMapping について
-
領域の確保について
-
指定したメモリアドレスの値の...
-
free関数で動作が止まる
おすすめ情報