0

我在 32 位 Ubuntu 虚拟机上使用 Eclipse 来处理项目。在尝试实现结构或尝试运行特定功能时,我遇到了一个大问题。功能是这个:

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;
}

该函数接收一个矩阵(定义如下),一个带有 1 和 0 的向量(用于了解要搜索的列,一个包含我们要在这些列中搜索的值的向量以及列数(等于向量的长度)和矩阵)。当它遇到第二个“如果”时,它给了我分段错误(我不明白它是什么),我可以看到以这种方式定义它是不正确的,但我已经尝试过并且我可以'似乎没有找到访问向量中值的方法。下面是我的结构矩阵:

typedef int *ind; 

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

在这个结构中,我的矩阵有一个指针和长度(行数);指针指向一个指针向量(每行一个指针),每个指针都指向一个向量,实际上就是我的矩阵行。这是我添加和创建空矩阵的函数:

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;
}

我知道这是一个非常具体的问题,但我一直在疯狂地改变我的功能并且似乎无法成功。

4

3 回答 3

5

你的定义i是这样的:

 ind *i;

您有以下定义ind

typedef int* ind;

这意味着您对i真的定义是这样的:

int ** i;

这是指向指针的指针,这意味着您必须错误地分配内存。

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

此分配仅用于 a 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,而是应该在刚刚为其分配内存的矩阵中写入内容。

于 2012-04-22T13:08:41.333 回答
1

换行

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

经过

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

我希望这有帮助。

于 2012-04-22T13:21:19.093 回答
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 循环比 while() 循环更不容易出错,并且节省了两行代码。
  • 对于计数和索引,无符号类型不易出错。(只有一个角盒)
  • 不要在 typedef 中隐藏指针;它会混淆你自己和他人。
  • 不要强制转换 malloc() 的返回值;它不是必需的,并且可能会抑制错误消息。
  • ptr = malloc (n * sizeof *ptr)是更稳定的 WRT 错字和未来的编辑。
  • 如果您分配一个可变大小的对象(例如您的矩阵),则将大小(元素数)存储该对象内。一个对象应该是“独立的”。
于 2012-04-22T15:38:51.653 回答