我在 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/