Ошибка сегментации в двумерном массиве Динамическое распределение - PullRequest
0 голосов
/ 22 января 2019
#include<stdio.h>
#include<stdlib.h>
struct Graph{
int V;
int E;
int **Adj;
};
struct Graph* adjMatrix(){
int u,v,i;
struct Graph *G;
G=(struct Graph*)malloc(sizeof(struct Graph));
if(!G){
    printf("Memory Error!\n");
    return;
}
printf("Enter number of nodes and number of edges:\n");
scanf("%d %d",&G->V,&G->E);
G->Adj=malloc((G->V)*(G->V)*sizeof(int));
for(u=0;u<(G->V);u++)
    for(v=0;v<(G->V);v++)
        G->Adj[u][v]=0; //This gives a segmentation fault.


printf("Enter node numbers in pair that connect an edge:\n");
for(i=0;i<(G->E);i++){
    scanf("%d %d",&u,&v);
    G->Adj[u][v]=1;
    G->Adj[v][u]=1;
}
return(G);
}
int main(){
struct Graph *G;
int i,j,count=0;
G=adjMatrix();
for(i=0;i<G->V;i++){
    for(j=0;j<G->V;j++){
        printf("%d ",G->Adj[i][j]);
        count++;
    }
    if(count==G->V)
        printf("\n");
}
return 0;
}

Код показывает ошибку сегментации, когда я пытался присвоить значение в двумерном массиве, т.е. при G-> Adj [u] [v] = 0; но я не знаю, что с этим не так? Потому что это просто присвоение массиву.

Ответы [ 2 ]

0 голосов
/ 22 января 2019
#include<stdio.h>
#include<stdlib.h>
struct Graph{
int V;
int E;
int **Adj;
};
struct Graph* adjMatrix(){
int u,v,i;
struct Graph *G;
G=malloc(sizeof(struct Graph));
if(!G){
    printf("Memory Error!\n");
    return 0;
}
printf("Enter number of nodes and number of edges:\n");
scanf("%d %d",&G->V,&G->E);
//First problem was here this is how you allocate a 2D array dynamically 
G->Adj=malloc((G->V)*sizeof(int*));
for(u=0;u<G->V;u++)
    G->Adj[u]=malloc((G->V)*sizeof(int));
for(u=0;u<(G->V);u++)
    for(v=0;v<(G->V);v++)
        G->Adj[u][v]=0; //This gives a segmentation fault.

    // i added some adjustment here to help you 
       printf("Enter node numbers in pair that connect an edge:\n");
    for(i=0;i<(G->E);i++){
    scanf("%d %d",&u,&v);
    if(u>=G->V || v>=G->V){
    printf("Error give the right input\n");
    i--;}
    else{
    G->Adj[u][v]=1;
    G->Adj[v][u]=1;}
}
return(G);
}
int main(){
struct Graph *G;
int i,j,count=0;
G=adjMatrix();
for(i=0;i<G->V;i++){
    for(j=0;j<G->V;j++){
        printf("%d ",G->Adj[i][j]);
        count++;
    }
    if(count==G->V)
        printf("\n");
}
return 0;
}
0 голосов
/ 22 января 2019

Ошибка сегментации возникает из-за ошибки в методе выделения 2D-массива, как это было сделано в следующей строке:

G->Adj=malloc((G->V)*(G->V)*sizeof(int));.

, которая фактически выделяла 1D-буфериз (G-> V) * (G-> V) целых чисел, поэтому он не может включить более поздний доступ в синтаксисе 2D, как вы хотите

В двух словах: при выделении 2D-массива, как вы хотитеВы должны сначала выделить 1D массив указателей.В вашем коде должно быть:

G->Adj = (int **)malloc(sizeof(int *)*G->V);

И затем выделите векторы G-> V для указателя:

for(i=0; i < G->V; i++) 
{
    G->Adj[i] = (int *)malloc(sizeof(int)*G->V);
}

Кроме того, хорошей практикой является проверкарезультат выделения не равен NULL (ошибка malloc), для каждого выделения

для общего объяснения распределения векторов c вы можете прочитать больше в Метод 2: «все еще можно использовать синтаксис [r] [c] дляaccess "way

Кроме того, в конце вашей программы отсутствует освобождение памяти, поэтому вы должны добавлять вызовы free () в обратном порядке (векторы, а затем указатели)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...