Исключение кучи при попытке напечатать значение указателя - PullRequest
0 голосов
/ 12 марта 2011

Извините за мой плохой английский.

Я только начал работать над проектом моего школьного финала, и я обнаружил ошибку в моем коде ...

Программа находится на C и выполняет матрицу (со стартовым указателем, количеством строк и столбцов). Первая функция должна составить матрицу с увеличением числа строк и столбцов и обнулить все значения (позже она будет использоваться для разностного восприятия, но не имеет значения). Позже есть функция, которая печатает матрицу.

Когда программа попадает в "printf", она ломается .. "Unhandled exception at 0x7789ea27 in image_pross.exe: 0xC0000374: A heap has been corrupted."

Вот код:

#include <stdio.h>

#include <stdlib.h>

struct matrix

{
    int* ptr;

    int row;

    int column;

};

matrix ZFMatrix(matrix preMtx,int nColumn,int nRow);

void printMatrix (matrix mtx);


void main( int argc, char* argv[])
{
    int matrixAdd[3][3]={{1,1,1},{1,-8,1},{1,1,1}};

    matrix mtx;

    mtx.ptr=&matrixAdd[0][0];

    mtx.row=3;

    mtx.column=3;

        mtx= ZFMatrix(mtx,2,2);

    printMatrix(mtx);

}
matrix ZFMatrix(matrix preMtx,int nColumn,int nRow)

{
    matrix newMtx;


    newMtx.column=nColumn*2+preMtx.column;

    newMtx.row=nRow*2+preMtx.row;

    newMtx.ptr= (int*) malloc((newMtx.row)*(newMtx.column));

    int i,j,*tmp=newMtx.ptr;

    //zero out the matrix

    for (i=0; i<newMtx.column;i++)

    {

        for(j=0;j<newMtx.row;j++)

        {

            *newMtx.ptr=0;

            newMtx.ptr++;


        }

    }

    newMtx.ptr=tmp;

     return newMtx;

}

void printMatrix (matrix mtx)

{

    int i=0,j=0;

    for (;i<mtx.column;i++)


    {
        for(;j<mtx.row;j++)

        {


            printf("%d, ", *mtx.ptr);

            mtx.ptr++;
        }
        printf("\n");
    }
}

1 Ответ

4 голосов
/ 12 марта 2011
newMtx.ptr= (int*) malloc((newMtx.row)*(newMtx.column));

Должно быть:

newMtx.ptr= (int*) malloc((newMtx.row)*(newMtx.column) * sizeof(int));

Вы выделяете newMtx.row * newMtx.column байтов , когда хотите целых чисел

Также,когда у вас есть malloc(), у вас должен быть соответствующий free() - или вы потеряете память.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...