gpt4 book ai didi

c - 在 C 中使用大数组时出现 EXCEPTION_ACCESS_VIOLATION

转载 作者:太空宇宙 更新时间:2023-11-04 08:47:31 25 4
gpt4 key购买 nike

这是我遇到的另一个问题。首先,我试图读取一个包含从 PicoScope 6 导出的信息的 4 级 matlab 文件,它从文件中读取四个数组,A、Tstart、Tinterval 和 Length。第一个数组是迄今为止最大的,它包含 1000004 个值,但是其他三个数组每个只包含一个值。当我执行下面的代码时,它成功读取文件,将其存储到多维数组中,但当我尝试使用该数组时失败

#include <jni.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <matio.h>
#include "ReadMatFile.h"

//macros
#define getLength(x) (sizeof(x) / sizeof(x[0]))

//variables
double *dataMatrix[4];
int innerSize[getLength(dataMatrix)];

//functions
jobjectArray convertToArray(JNIEnv *env, double **data, int length1D,
int *length2D);

JNIEXPORT jdoubleArray JNICALL Java_ReadMatFile_readMatFile(JNIEnv *env,
jobject object, jstring str) {
const char *fileName = (*env)->GetStringUTFChars(env, str, 0);
mat_t *matfp;
matvar_t *matvar;
matfp = Mat_Open(fileName, MAT_ACC_RDONLY | MAT_FT_MAT4);
if ( NULL == matfp) {
fprintf(stderr, "Error opening MAT file %s\n", fileName);
return NULL;
}
int i = 0;
while ( NULL != (matvar = Mat_VarReadNext(matfp))) {
double *data = (double*) (matvar->data);
dataMatrix[i] = data;
innerSize[i] = (int) matvar->nbytes / matvar->data_size;
Mat_VarFree(matvar);
matvar = NULL;
i++;
}
Mat_Close(matfp);
(*env)->ReleaseStringUTFChars(env, str, fileName);
int s;
for(s = 0; s < innerSize[0]; s++)
printf("A[%d] = %e\n", s, dataMatrix[0][s]); /* Fails here */
return NULL;
//return convertToArray(env, dataMatrix, getLength(dataMatrix) ,innerSize);
}

jobjectArray convertToArray(JNIEnv *env, double **data, int length1D,
int *length2D) {
jsize outerSize = (jsize) length1D;
jclass class = (*env)->FindClass(env, "[D");
jobjectArray outer = (*env)->NewObjectArray(env, outerSize, class, 0);
jsize i;
for (i = 0; i < outerSize; i++) {
jsize innerSize = (jsize) length2D[i];
jdoubleArray inner = (*env)->NewDoubleArray(env, innerSize);
(*env)->SetDoubleArrayRegion(env, inner, 0, innerSize, data[i]);
(*env)->SetObjectArrayElement(env, outer, i, inner);
(*env)->DeleteLocalRef(env, inner);
}
return outer;
}

这是什么原因?它创建了一个 minidump当我运行这个应用程序时。数组是否太大?

对此的修复以及对问题的解释将不胜感激!

在此先感谢大家。

最佳答案

我怀疑您的问题出在以下代码中:

double *data = (double*) (matvar->data);
dataMatrix[i] = data;
innerSize[i] = (int) matvar->nbytes / matvar->data_size;
Mat_VarFree(matvar); // whoopsie

如果 Mat_VarFree 做了我想它做的事,matvar->data 不再是一个有效的指针,这意味着 dataMatrix[i] 是不再是有效指针,因此崩溃。

我认为你打算做的是更符合

innerSize[i] = matvar->nbytes / matvar->data_size;
dataMatrix[i] = malloc( sizeof *dataMatrix[i] * innerSize[i] );
if ( dataMatrix[i] )
memcpy( dataMatrix[i], matvar->data, matvar->nbytes );
Mat_VarFree( matvar );

也就是说,在 matvar->data 中创建数据的本地副本,并将其保存到您的 dataMatrix 中。在您的原始代码中,您复制的只是一个指针值;您从未创建过单独的数据副本。

关于c - 在 C 中使用大数组时出现 EXCEPTION_ACCESS_VIOLATION,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21099179/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com