2012-11-04 93 views
4

我在這裏有一個C mex文件,它可以正常執行,但是在完成執行後會使用segfault崩潰MATLAB。由於它在程序執行完成後崩潰了,這讓我認爲MATLAB自動釋放分配的內存會導致問題。但是,我釋放了我自己的動態分配的變量,並且不嘗試釋放mxArray結構。請看一看,看看能否幫助我確定它爲什麼會導致MATLAB崩潰。Mex函數在完成後崩潰

#include <mex.h> 
#include <matrix.h> 
#include <stdio.h> 

void mexFunction(
int nlhs, mxArray *plhs[], 
int nrhs, const mxArray *prhs[]) 
{ 
    /* Declare variables. */ 
    int i ,j, numdims, *ipos, count; 
    const mwSize *dim_array; 
    mwSize size; 
    double *pos, rad; 

    /* Ingest inputs. */ 
    numdims = mxGetNumberOfDimensions(prhs[0]); 
    dim_array = mxGetDimensions(prhs[0]); 
    rad = mxGetScalar(prhs[1]); 
    pos = mxGetData(prhs[0]); 
    size = dim_array[0]*dim_array[1]; 

    ipos = (int*) mxMalloc(size); 
    for (i = 0; i < size; i++) 
     ipos[i] = (int) (pos[i]*rad); 
    count = 0; 
    for (i = 0; i < size; i+=2) 
     for (j = i + 2; j < size; j+=2) 
      if (ipos[i] == ipos[j]) 
       if (ipos[i+1] == ipos[j+1]) 
        count++; 
    mxFree(ipos); 

    /* Generate output */ 
    plhs[0] = mxCreateDoubleScalar(count); 
    printf("\nProgram finished executing!\n"); 
} 

在此先感謝您的幫助!

編輯:我還應該注意,程序的輸入是爲了(按順序)一個2 x n矩陣和一個標量,其中n可以是任何正整數。實際的程序正確地檢查了尺寸,但我沒有在這裏包含這些行來節省編碼空間。

回答

1

寫過與動態內存分配幾百C程序後,我很慚愧一點點地說,錯誤是這樣的:

更換

ipos = (int*) mxMalloc(size); 

ipos = (int*) mxMalloc(size*sizeof(int)); 

看來,它總是最大的失誤,逃避我。我想感謝所有可能花了一兩分鐘時間來看帖子的人。

+0

現在很有趣:) – Dimochka

2

UPD。你是對的 - 當矩陣變大,它崩潰:)

所以我想我有一個想法:

嘗試改變的代碼

plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL); 
mxGetPr(plhs[0])[0] = (double) count; 

你兩行新單線

plhs[0] = mxCreateDoubleScalar(count); 

它完成後不會崩潰。

+0

不,我沒有忘記使用頭文件。你有沒有嘗試使用更大的輸入矩陣?說一個2x30? –

+0

另外,你正在運行什麼版本的MATLAB,你使用哪個編譯器?我在Windows 7中使用帶有SDK 7編譯器的MATLAB R2011b。我也在使用gcc的Mac上嘗試過它,但在終止時它仍然崩潰。 –

+0

看看更新的答案 – Dimochka