
こんにちは。
ファイルオープンし、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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# 関数ポインタの高速化のメリット 7 2023/05/05 20:15
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- C言語・C++・C# c言語の問題です 2 2023/07/21 10:51
- C言語・C++・C# 100バイトのバイナリファイルを読み込んで別のファイルに書き込みたいのですが、型をどうすればいいのか 1 2022/11/03 17:11
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
c言語のポインタへの文字列入力...
-
C言語に関する質問
-
C言語 mallocとfreeについて
-
ビットをローテートするプログ...
-
メモリ解放について
-
画像を読み込む配列の確保。
-
文字列のメモリ保持期間とポイ...
-
ポインタのポインタの初期化法
-
reallocについて
-
配列の添え字の最大数とは?
-
スタック破壊の上手な見つけ方...
-
allocってなんですか?
-
文字列ポインタとgets関数の関...
-
グローバル変数のサイズ
-
newでrealloc?
-
プログラムが途中で強制終了し...
-
newしないオブジェクトについて
-
16進ダンプのプログラム
-
mallocで確保するメモリの領域...
-
free関数で動作が止まる
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
c言語のポインタへの文字列入力...
-
allocってなんですか?
-
newしないオブジェクトについて
-
malloc呼び出し時のセグメンテ...
-
入れ子になった構造体について
-
ヒープメモリの解放について
-
ビットをローテートするプログ...
-
C++で、メンバもヒープに確保さ...
-
void*型のデータサイズ
-
Win32APIでのメモリ管理について
-
配列の添え字の最大数とは?
-
C++のnewで確保したメモリーの...
-
プログラムが途中で強制終了し...
-
C言語 mallocとfreeについて
-
win32APIのHeapAlloc()の使い方...
-
LoadLibraryでAccess Violation...
-
グローバル変数のサイズ
-
MFCのCStringについて
-
メモリ不足になってしまう。
-
ヒープの実際の限界値は?
おすすめ情報