2012-04-22 31 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