• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:malloc関数によるメモリの確保)

malloc関数によるメモリの確保について教えてください。

このQ&Aのポイント
  • malloc関数を使用してメモリを確保する際、メモリアドレスはデータのサイズによらず一定となりますが、データのサイズが大きくなるとエラーが発生することがあります。
  • エラーのメッセージには、保護されているメモリに読み取りまたは書き込み操作を行おうとしたために発生した例外が表示されます。
  • このエラーを回避するためには、メモリの確保サイズを制限するか、より大きなメモリを使用する必要があります。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

質問の意味が今ひとつ解らないのですが、 for(k=0;k<len1/8;k++){ for(i=0;i<8;i++){ *(in+i+8*k)=data[i]; } } の部分で、in配列は int in[2000]; なのに、 *(in+i+8*k) のkの最大値は(len1/8-1)です。len1は int len1=10000; なので、in配列の後のメモリを破壊してしまいます。

bonzomania
質問者

お礼

ありがとうございました。 ご指摘のとおりでした。

その他の回答 (2)

  • php504
  • ベストアンサー率42% (926/2160)
回答No.2

デバッグでframeworkの例外がでてます。Cのプロジェクトになってないのでは? 新規ソリューションの作成からやり直してwin32アプリを選びましょう。

  • hidebun
  • ベストアンサー率50% (92/181)
回答No.1

ソースコードをそのまま貼ってください。 欠けている情報はソースから読み取れます。

bonzomania
質問者

補足

ソースを貼り付けました。 len1が100の時はsize_out2[]はdoubleのサイズX10で80となりますが、 len1が3000を超えるとsize_out2[]が8となり、結果出力は意味のない大きな数字が出力されます。 原因と対処法についてご教授ください。よろしくお願いいたします。 #include "stdafx.h" #include <stdlib.h> #include<stdio.h> #include<math.h> /*大域変数*/ int i,k; /* 関数の宣言 */ void func1(double *out1[], int *in, int len1, int len2); /*メイン関数*/ void main(){ int data[8]={1,1,1,1,1,1,1,1}; int in[2000]; int len1=10000; int len2=10; double *out1[2]; /*メモリ領域割り当て*/ out1[0] = (double*)malloc(len1*len2*sizeof(double)); out1[1] = (double*)malloc(len1*len2*sizeof(double)); printf("size out1[]= %d\n",len1*len2*sizeof(double)); printf("addr_out1[1]=%d,addr_out1[2]=%d\n",&out1[0][0],&out1[1][0]); /*データ作成*/ for(k=0;k<len1/8;k++){ for(i=0;i<8;i++){ *(in+i+8*k)=data[i]; } } /*関数*/ func1(out1, in, len1, len2); /*結果出力*/ for(i=0;i<10;i++){ printf("out = %f\n",out1[0][i]); } /*メモリ開放*/ free(out1[0]); free(out1[1]); return; } /*関数*/ void func1(double *out1[], int *in, int len1, int len2) { double *out2[2]; /*メモリ領域割り当て*/ out2[0] = (double*)malloc(len2*sizeof(double)); out2[1] = (double*)malloc(len2*sizeof(double)); printf("size = %d\n",len2*sizeof(double)); printf("%d,%d\n",&out2[0][0],&out2[1][0]); /*データ入力*/ for(i = 0; i<len2; i++){ *(out1[0]+i) = *(out2[0]+i)=*in; *(out1[1]+i) = *(out2[1]+i)=*in; } /*データ作成*/ free(out2[0]); free(out2[1]); return; }

関連するQ&A