C初心者です。
malloc関数によるメモリの確保に関して教えてください。
2次元配列のサイズに対してmalloc関数の引数値をたとえば、
(double*)malloc(datasize*sizeof(double))
などとしメモリ領域を確保すると、メモリアドレスはデータのサイズ
によらず一定 1234044、1234048となります。
データサイズを大きくし、datasize*sizeof(double)が16Kバイトを超えるとcmd.exeがエラーとなり落ちます。
デバックモードで実行すると
「"System.AccessViolationException"のハンドルされていない例外が不明なモジュールです。で発生しました。
追加情報:保護されているメモリに読み取りまたは書き込み操作を行おうとしました。他のメモリがこわれていることが考えられます」
というメッセージがでます。
コンパイラはExpressEdition2008です。
この現象を回避するにはどうすべきか、なぜこのようなことが起こるのかご教授ください。
よろしくお願いいたします。
No.1
- 回答日時:
ソースコードをそのまま貼ってください。
欠けている情報はソースから読み取れます。
この回答への補足
ソースを貼り付けました。
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が見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- デスクトップパソコン ん~…分からん 7 2022/06/10 10:47
- CPU・メモリ・マザーボード 「コンピューターのメモリが不足しています」 5 2022/12/15 10:10
- CPU・メモリ・マザーボード 「コンピューターのメモリが不足しています」 3 2022/12/15 22:07
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- Ruby 【メモリ不足で落ちる(python)】 1 2022/05/26 21:22
- Excel(エクセル) 【困っています】VBA 追加処理の記述を教えてください。 1 2022/08/25 22:54
- Visual Basic(VBA) 【困っています2】VBA 追加処理の記述を教えてください。 2 2022/08/26 11:42
- C言語・C++・C# C言語 ポインタ 配列 2 2022/06/02 17:29
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
newしないオブジェクトについて
-
mallocについて
-
fread関数および動的なメモリ確...
-
MFCのCStringについて
-
配列の添え字の最大数とは?
-
LoadLibraryでAccess Violation...
-
画像を読み込む配列の確保。
-
x64環境で連続4GB以上のメモリ...
-
allocってなんですか?
-
スタック破壊の上手な見つけ方...
-
free関数で動作が止まる
-
callocの処理速度
-
LPTSTR型の変数に文字を格納
-
構造体でchar name[]と*nameの...
-
C++ 構造体のnew
-
c言語のポインタへの文字列入力...
-
セグメントエラー
-
C言語 配列の長さの上限
-
n番目に大きい数を求めるアル...
-
Run-Time Check Failure #3とい...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
mallocについて
-
c言語のポインタへの文字列入力...
-
allocってなんですか?
-
newしないオブジェクトについて
-
ヒープメモリの解放について
-
C++で、メンバもヒープに確保さ...
-
MSDNがgethostbynameではなくge...
-
プログラムが途中で強制終了し...
-
配列の添え字の最大数とは?
-
Accessで、メモリを開放するタ...
-
malloc呼び出し時のセグメンテ...
-
ヒープ領域の限界値設定
-
スタック破壊の上手な見つけ方...
-
C言語 mallocとfreeについて
-
指定したメモリアドレスの値の...
-
stringの最大サイズ
-
16進ダンプのプログラム
-
入れ子になった構造体について
-
64ビットと32ビットの違い
-
free関数で動作が止まる
おすすめ情報