プロが教えるわが家の防犯対策術!

こんにちは。

ファイルオープンし、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件)

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
  }
}

このように記述することで、動的なメモリ割り当てが行われているのでしょうか?

補足日時:2006/11/14 18:30
    • good
    • 0

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