2011-03-12 27 views
0

對不起,我的英文不好。試圖打印指針的值時發生堆異常

我剛開始在我校最終的項目工作,我在我的代碼遇到一個錯誤......

該計劃是在C和它使一個矩陣襲擊(與起始指針,行和列的NUM )。第一個函數應該製作一個矩陣,放大行和列的數量,並將所有值清零(稍後它將用於不同的配置,但不會這麼做)。後來有一個函數可以打印出矩陣。

當程序獲取到的 「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"); 
    } 
} 
+0

從技術上講,你不打印指針的**值**;您正在打印指針所指向的值:-) – Pointy 2011-03-12 13:26:25

+1

這不是編譯器中斷 - 當您運行程序時,編譯器早已消失。這是你的程序打破 - 或者說,被打破。 – 2011-03-12 13:30:52

回答

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

應該是:

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

你分配newMtx.row * newMtx.column字節當你想個整數

而且,當你有一個malloc()你應該有一個相應的free() - 否則你會泄漏內存。

+0

哇,我怎麼看不到?解決 – 2011-03-12 13:28:29

+3

@almog這是一個常見的錯誤...並放棄C和使用更現代的語言的一個很好的理由。 – 2011-03-12 13:32:37

+0

順便說一句....我不認爲我打算釋放newMtx,因爲我打印後仍然會使用它... @jimBalter我的學校老師不太瞭解C++或其他新語言.. 。所以我必須用C語言編寫這個文件 – 2011-03-12 13:38:14