c - C中的指针 - 构造矩阵时为 "Segmentation Fault"

标签 c matrix struct segmentation-fault

我在 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 的 vector (以了解要搜索哪些列、一个包含我们要在这些列中搜索的值的 vector 以及列数(等于长度 vector 和矩阵)。当它遇到第二个“if”时,它给我 Segmentation Fault(我不明白它是什么),我可以看到以这种方式定义它是不正确的,但我已经尝试过而且我似乎无法找到一种方法来访问 vector 中的值。下面是我的结构矩阵:

typedef int *ind; 

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

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

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

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

最佳答案

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,而是你应该在你刚刚分配内存的矩阵中写入内容。

关于c - C中的指针 - 构造矩阵时为 "Segmentation Fault",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10268152/

相关文章:

C 结构体和指针

c# - 在 C# 中将 float 保存到二进制文件并在 C 中打开

python - 矩阵:有效地将第 n 行移动 n 个位置

c - 查找稀疏矩阵中元素周围的最大区域

python - 在pyspark sql中转换多个结构列数组

c - 在结构体内部使用结构体

c - 尝试打印32位浮点图像的像素值

c - C 问题中的 pow() 函数

c - 内存操作 : set every n-th bit (C/C++) in modern CPUs/GPUs

c - 未正确读取矩阵