2012-04-22 32 views
0

我使用的是32位的Ubuntu虛擬機上Eclipse來對某個項目時。在嘗試實現一個結構或者試圖運行特定功能時,我遇到了一個很大的問題。的功能是這樣的一種:指針用C - 「段錯誤」構建矩陣

int count (matrix m, int v[], int w[], int col) { 

    int r=0; 
    int j=0; 

    while (j < m.length) { 
     int k=0; 
     bool aux=true; 

     while (k < col && aux){ 
      if (v[k] == 1) { 
       if(m.i[j][k] != w[k]) 
        aux=false; 
      } 
      k++; 
     } 

     if(aux) r++; 
     j++; 
    } 
    return r; 
} 

該函數接收一個矩陣(如下定義),與一和零(學習搜索哪個列,我們希望在這些列於查詢的值的向量和向量還列(等於長度的向量和矩陣),當它攻擊的數量第二個「如果」它給了我分段錯誤(我不明白它是什麼),我可以看到,這是不正確的定義這樣的說法,但我已經嘗試過,並試圖和我似乎無法找到一種方法來訪問向量中的值這裏緊跟我的結構矩陣:

typedef int *ind; 

struct matrix { 
    ind *i; 
    int length; 
}; 
typedef struct matrix matrix; 

在這種ST我的矩陣有一個指針和長度(行數);指針指向一個指針向量(每行一個指針),每個指針都指向一個向量,實際上,這是我矩陣的一行。在這裏我去功能添加和創建一個空的矩陣:

matrix emptyS(int n, int col) { 
matrix m; 
int d=0; 
m.length=0; 
m.i=(ind*) malloc(sizeof(int)*n); 
int x; 
    for (x=0; x < n; x++) 
      { 
       *m.i = (int*) malloc(sizeof(int)*col); 
      } 
while (d<n){ 
    m.i[d]=NULL; 
    d++; 
} 
return m; 
} /*Updated*/ 

matrix add(matrix m,int v[]){ 
    m.i[m.length+1]=v; 
    m.length++; 
    return m; 
} 

我知道這是一個很具體的問題,但我一直在瘋狂改變我的功能似乎並不能獲得成功。

+0

你可以在崩潰的'if'和打印相關值('m','w','m.i','j','k')之前添加一個調試打印行嗎?或者在調試器中查看它們? – Vlad 2012-04-22 13:08:16

回答

5

你的i定義是這樣的:

ind *i; 

你的ind如下定義:

typedef int* ind; 

這意味着你的i定義真的是這樣的:

int ** i; 

這是一個指向指針的指針,這意味着你必須錯誤地分配你的內存。

m.i=(ind*) malloc(sizeof(int)*n); 

這種分配僅僅是一個int*,但對於第二個指針?你從來沒有爲它分配任何內存!

分配矩陣的行,像這樣:

for (int x = 0; x < nofrows; x++) 
    { 
     *m.i = (int*)malloc(sizeof(int)); 
    } 

編輯

你的代碼,你的矩陣做你的配置後,將你的指針的矩陣NULL,實質上只留下自己分配晃來晃去,與沒有指向它的所有記憶!

while (d<n){ 
    m.i[d]=NULL; <--- LEAVES YOUR MEMORY JUST ALLOCATED FOR ROW d DANGLING. 
    d++; 
} 

你不應該將其設置爲NULL,而是你應該在你的矩陣,你只是分配內存寫的東西。

+0

我在想同樣的事情,但顯然下面的'add'函數似乎是以某種方式添加行的。 – Tudor 2012-04-22 13:09:45

+0

@Tudor,但我沒有看到任何內存正在分配給行,所以你怎麼可以向行寫任何東西?將它們設置爲「NULL」不會分配內存! – 2012-04-22 13:12:34

+0

我知道,這就是我在回答中所說的話。但是在下面他有一個'add'函數,在我看來可能會被用來傳遞一個分配的行,然後將其複製到矩陣中。但我們不知道他在做什麼。 – Tudor 2012-04-22 13:13:38

1

通過

m.i=(ind*) malloc(sizeof(ind)*n); 

替換行

m.i=(ind*) malloc(sizeof(int)*n); 

我希望這有助於。

+0

沒有工作,我也認爲我的方式訪問矩陣中的向量是錯誤的,但我不知道如果問題只是在那裏:/ – 2012-04-22 16:16:59

1
#include <stdlib.h> 
#include <stdio.h> 

typedef enum{false,true} bool; 

typedef struct matrix_ { 
    int **rows; 
    unsigned size ; 
    unsigned used ; 
} matrix; 

unsigned count (matrix m, int v[], int w[], unsigned ncol) { 
    unsigned cnt=0; 
    unsigned j=0; 

    for (j=0; j < m.used; j++) { 
     unsigned k; 
     bool aux=true; 

     for (k=0;k < ncol && aux; k++){ 
      if (v[k] == 1 && m.rows[j][k] != w[k]) { 
        aux=false; 
      } 
     } 

     if(aux) cnt++; 
    } 
    return cnt; 
} 
#define barf(s) do { \ 
    fprintf (stderr, "%s\n", s); \ 
    exit (EXIT_FAILURE); \ 
    } while(0) 

matrix emptyS(unsigned siz) { 
    matrix m; 
    unsigned d; 

    m.used=0; 
    m.size = siz; 
    m.rows = malloc(siz * sizeof *m.rows); 

    for (d=0; d<siz; d++){ 
     m.rows[d]=NULL; 
    } 
    return m; 
} 

matrix add(matrix m,int v[]){ 
    if (m.used >= m.size) barf("Danger, Bill Robinson!"); 
    m.rows[m.used++]=v; 
    return m; 
} 
int main(void) 
{ 
int a[] = { 0,1,0}; 
int b[] = { 0,1,1}; 
int c[] = { 0,0,0}; 
int v[] = { 1,0,1}; 
int w[] = { 0,1,0}; 
matrix mymatrix; 
unsigned zcount; 

mymatrix = emptyS(3); 
mymatrix = add(mymatrix, a); 
mymatrix = add(mymatrix, b); 
mymatrix = add(mymatrix, c); 

zcount = count(mymatrix, v, w, 3); 

printf("Count = %u\n", zcount); 

return 0; 
} 

幾個 '文體' 提示:

  • for循環是容易出錯小於而()循環,並保存兩行。
  • 對於計數和指數,無符號類型的錯誤率較低。 (只有一個角落案例)
  • 不要在typedef中隱藏指針;它會讓你自己和其他人感到困惑。
  • 請勿投射malloc()的返回值;它不是必需的,可能會抑制錯誤消息。
  • ptr = malloc (n * sizeof *ptr)是更穩定的WRT錯字和未來編輯。
  • 如果分配一個varable大小的對象(如你的矩陣)存儲的大小(元素的數量)內部該對象。一個對象應該是「獨立的」。
+0

謝謝@wildplasser你的幫助,但我不能使用這種結構。這是我課程中的一個主題項目,我們必須按照老師的說法來實施,所以避免「for」循環,「做」並且總是施放malloc(我甚至認爲你不能沒有演員!)但是,無論如何感謝! :) – 2012-04-22 16:18:57

+0

如果您認爲我的版本比您的版本更具可讀性(甚至更好),您可以告訴您的老師他是個白癡。順便說一句:我在你的'm.i [m.length + 1] = v;'行中解決了這個問題。 – wildplasser 2012-04-22 16:22:56

+0

你的作品和完美的閱讀,只是我不能使用它,但我會嘗試適應我的版本!謝謝! – 2012-04-22 17:00:19