-1

我收到以下错误:

运行时检查失败 #2 - 变量‘mat’周围的堆栈已损坏”在控制台中给出结果后。

但是,我观察到,CreateMatrix 函数会引发访问冲突.. 对于更大的矩阵维度。例如,适用于 5x7,但不适用于 50 x 70。如何?

程序只是创建矩阵(初始化)和设置+打印矩阵元素。

此外,问题的警告是我被要求不要在 main() 中使用“Matrix* mat..”之类的东西。否则,解决方案是直截了当的。

我希望,你明白我的问题。

更详细的代码:

struct Matrix
{
    int width;
int height;
int* data;
};
typedef struct Matrix Matrix;

int main()
{
    Matrix mat, *matP;

    //1. Things that Works...
    matP = CreateMatrix(&mat,700,500);         
    SetValue(matP,500,600,-295);
    int val=GetValue(matP,500,600);
    printf("%d\n",val); 


    //2. Things that does NOT work... !!!
    CreateMatrix(&mat,700,500); // this is C-style "Call-By-Reference" CreateMatrix2()
    SetValue(&mat,500,600,-295); // ERROR in this function, while setting matrix element
    val=GetValue(&mat,500,600);

    printf("%d\n",val); 
}


void SetValue(Matrix* mat,int row,int col,int value)
{
    *(mat[(mat->width*(row-1)) + (col-1)].data) = value;// <------ ERROR here

    // Unhandled exception at... Access violation writing location 0x000001f4
}

Matrix * CreateMatrix(Matrix *mat,int width,int height)
{        
    // mat = (Matrix*)malloc(width*height*(sizeof(Matrix))); // As told by Salgar
    mat->height = height;
    mat->width = width;

    for(int i=0; i < height; i++ )
    {
        for(int j=0; j < width; j++ )
        {
            mat[width*i + j].width = width;
            mat[width*i + j].height = height;
            mat[width*i + j].data = (int*)malloc(sizeof(int));
        }
    }
}
4

3 回答 3

3

当您分配mat到此行时:

 mat = (Matrix*)malloc(width*height*(sizeof(Matrix)));

它正在更改的本地范围副本,mat因此您在调用函数的堆栈上声明的 mat 没有发生任何事情。

您需要将一个指针传递给一个指针,而不是在堆栈上声明一个指针,因为您不能用您在堆上声明的内容覆盖它。

Matrix* mat;
CreateMatrix(&mat,700,500);

Matrix * CreateMatrix(Matrix **mat,int width,int height)
{
   ...
   *mat = malloc(etc)
   ...
}
于 2013-06-11T13:20:31.120 回答
0

您需要正确引用它,
而不是: (mat[(mat->width (row-1)) + (col-1)].data) = value;// <------ ERROR here

mat->data[(mat->width*(row-1)) + (col-1)] = value;// <------ 这里没有错误

此外,您的 CreateMatrix 函数完全搞砸了

Matrix * CreateMatrix(Matrix *mat,int width,int height)
{        
    // mat = (Matrix*)malloc(width*height*(sizeof(Matrix))); // As told by Salgar
    mat->height = height;
    mat->width = width;

    for(int i=0; i < height; i++ )
    {
        for(int j=0; j < width; j++ )
        {
            mat[width*i + j].width = width;
            mat[width*i + j].height = height;
            mat[width*i + j].data = (int*)malloc(sizeof(int));
        }
    }
}

改用这样的东西:

Matrix * CreateMatrix(Matrix *mat,int width,int height)
{        
    mat->height = height;
    mat->width = width;
    mat->data = (int*) malloc(sizeof(int) * height * width);
}
于 2013-06-12T05:36:21.680 回答
0
struct Matrix
{
int width;
int height;
int* data;
};
typedef struct Matrix Matrix;

int main()
{
Matrix mat, *matP;

//2. Things that does NOT work... !!!
CreateMatrix(&mat,700,500); // this is C-style "Call-By-Reference" CreateMatrix2()
SetValue(&mat,500,600,-295); // ERROR in this function, while setting matrix element
val=GetValue(&mat,500,600);

printf("%d\n",val); 

free(mat->data);
} 


void SetValue(Matrix* mat,int row,int col,int value)
{
*(mat[(mat->width*(row-1)) + (col-1)].data) = value;// <------ ERROR here

// Unhandled exception at... Access violation writing location 0x000001f4
}

void CreateMatrix(Matrix *mat,int width,int height)
{        
mat->height = height;
mat->width = width;
mat->data = (int*)malloc(width*height*sizeof(int));
}

如果我理解你的限制是,不要在主函数中使用指针,所以我们声明一个局部变量,然后传递它的指针,它获取数据指针以及分配给它的宽度和高度。

于 2013-06-12T05:58:11.280 回答