2013-06-24 110 views
2

我已经编写了代码,用于生成包含行和列的矩阵,每行都有用户指定的列数(请参阅下面的node_degree)。然后我用矩阵填充矩阵中的每个条目(值并不重要)。矩阵的内存分配

当我使用Geany在Fedora上构建程序时,没有收到任何错误消息。然而,当我运行程序我得到:

./geany运行script.sh 5号线:3586段错误(转储核心 )” ./ ad_matrix_outside_main

注:ad_matrix_outside_main是名且该C文件的

下面是程序:

#include <stdio.h> 
#include <stdlib.h> 
#define NODES (10) 
#define CONNECTED (5) 

int main() 
{ 
int i, j; 
double **matrix; 

matrix = (double **)malloc(sizeof(double *)*NODES); 

int node_degree[CONNECTED]; //Example: 5 nodes are connected (have non-zero degree).  

for(i=0; i<CONNECTED; i++) 
{ 
    printf("Enter degree of node %d\n", i); //Index is node, value is degree. 
    scanf("%d", &node_degree[i]);        
} 

for(i=0; i<CONNECTED; i++) 
{ 
    matrix[i] = (double*)malloc(sizeof(double)* (node_degree[i] + 1)); 
} 

for(i=0; i<NODES; i++) 
{ 

    for(j=0; j<node_degree[i]; j++) 
    { 
     matrix[i][j] = j; //j can be the node that node i connected to. 
    } 
    matrix[i][j] = NODES; 
} 

for(i=0; i<NODES; i++) 
{ 
    free(matrix[i]); 
} 

free(matrix); 
return(0); 
} 

什么引起的错误我有一种感觉我的符号?可能是问题。

+0

每当你得到一个分割故障,您应该编译'-g' GCC选项的代码,然后使用bash命令'的ulimit -c unlimited'使核心转储和执行的二进制文件,所以,你会得到一个核心转储。然后你可以使用gdb和'backtrace'来知道崩溃的真实原因 – VoidPointer

回答

1
#include <stdio.h> 
#include <stdlib.h> 
#define NODES (10) 
#define CONNECTED (5) 

int main() 
{ 
int i, j; 
double **matrix; 

matrix = (double **)malloc(sizeof(double *)*NODES); 

int node_degree[CONNECTED]; //Example: 5 nodes are connected (have non-zero degree).  

for(i=0; i<CONNECTED; i++) 
{ 
    printf("Enter degree of node %d\n", i); //Index is node, value is degree. 
    scanf("%d", &node_degree[i]);        
} 

for(i=0; i<CONNECTED; i++) 
{ 
    matrix[i] = (double*)malloc(sizeof(double)* (node_degree[i] + 1)); 

//在这里的malloc 5 }

for(i=0; i<NODES; i++) 
{ 

    for(j=0; j<node_degree[i]; j++) 
    { 
     matrix[i][j] = j; //j can be the node that node i connected to. 
    } 
    matrix[i][j] = NODES; 

//在这里指定为10! }

for(i=0; i<NODES; i++) 
{ 
    free(matrix[i]); 
} 

free(matrix); 
return(0); 
} 
+0

谢谢!我应该发现这一点。 – Mel