アプリ版:「スタンプのみでお礼する」機能のリリースについて

C初心者です。
malloc関数によるメモリの確保に関して教えてください。

2次元配列のサイズに対してmalloc関数の引数値をたとえば、
(double*)malloc(datasize*sizeof(double))
などとしメモリ領域を確保すると、メモリアドレスはデータのサイズ
によらず一定 1234044、1234048となります。
データサイズを大きくし、datasize*sizeof(double)が16Kバイトを超えるとcmd.exeがエラーとなり落ちます。
デバックモードで実行すると
「"System.AccessViolationException"のハンドルされていない例外が不明なモジュールです。で発生しました。

追加情報:保護されているメモリに読み取りまたは書き込み操作を行おうとしました。他のメモリがこわれていることが考えられます」
というメッセージがでます。

コンパイラはExpressEdition2008です。
この現象を回避するにはどうすべきか、なぜこのようなことが起こるのかご教授ください。

よろしくお願いいたします。

A 回答 (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配列の後のメモリを破壊してしまいます。
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/02/26 00:12

デバッグでframeworkの例外がでてます。

Cのプロジェクトになってないのでは?
新規ソリューションの作成からやり直してwin32アプリを選びましょう。
    • good
    • 0

ソースコードをそのまま貼ってください。


欠けている情報はソースから読み取れます。

この回答への補足

ソースを貼り付けました。
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;
}

補足日時:2010/02/25 00:21
    • good
    • 0

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