二维阵列动态分配中的分段错误 #包括 #包括 结构图{ INTV; INTE; int**Adj; }; 结构图*adjMatrix(){ int u,v,i; 结构图*G; G=(结构图*)malloc(sizeof(结构图)); if(!G){ printf(“内存错误!\n”); 返回; } printf(“输入节点数和边数:\n”); 扫描频率(“%d%d”,&G->V,&G->E); G->Adj=malloc((G->V)*(G->V)*sizeof(int)); 对于(u=0;uV);u++) 对于(v=0;vV);v++) G->Adj[u][v]=0;//这会导致分段错误。 printf(“成对输入连接边缘的节点编号:\n”); 对于(i=0;iE);i++){ scanf(“%d%d”、&u和&v); G->Adj[u][v]=1; G->Adj[v][u]=1; } 回报率(G); } int main(){ 结构图*G; int i,j,计数=0; G=调整矩阵(); 对于(i=0;iV;i++){ 对于(j=0;jV;j++){ printf(“%d”,G->Adj[i][j]); 计数++; } 如果(计数==G->V) printf(“\n”); } 返回0; }

二维阵列动态分配中的分段错误 #包括 #包括 结构图{ INTV; INTE; int**Adj; }; 结构图*adjMatrix(){ int u,v,i; 结构图*G; G=(结构图*)malloc(sizeof(结构图)); if(!G){ printf(“内存错误!\n”); 返回; } printf(“输入节点数和边数:\n”); 扫描频率(“%d%d”,&G->V,&G->E); G->Adj=malloc((G->V)*(G->V)*sizeof(int)); 对于(u=0;uV);u++) 对于(v=0;vV);v++) G->Adj[u][v]=0;//这会导致分段错误。 printf(“成对输入连接边缘的节点编号:\n”); 对于(i=0;iE);i++){ scanf(“%d%d”、&u和&v); G->Adj[u][v]=1; G->Adj[v][u]=1; } 回报率(G); } int main(){ 结构图*G; int i,j,计数=0; G=调整矩阵(); 对于(i=0;iV;i++){ 对于(j=0;jV;j++){ printf(“%d”,G->Adj[i][j]); 计数++; } 如果(计数==G->V) printf(“\n”); } 返回0; },c,C,当我试图在2D数组中赋值时,代码显示分段错误,即G->Adj[u][v]=0;但我不知道这有什么不对?因为它只是对数组的赋值。分段错误是由于2D数组分配方法的错误造成的,正如我们在下面一行所做的那样: G->Adj=malloc((G->V)*(G->V)*sizeof(int)) 它实际上分配了一个由(G->V)*(G->V)整数组成的1D缓冲区,所以它不能像您所希望的那样启用2D语法的后续访问 简言之:当按照您的意愿分配2D数组时,您应该首先分配指针的1D数组。 在您的代码中,应该是: G-

当我试图在2D数组中赋值时,代码显示分段错误,即G->Adj[u][v]=0;但我不知道这有什么不对?因为它只是对数组的赋值。

分段错误是由于2D数组分配方法的错误造成的,正如我们在下面一行所做的那样:

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

它实际上分配了一个由(G->V)*(G->V)整数组成的1D缓冲区,所以它不能像您所希望的那样启用2D语法的后续访问

简言之:当按照您的意愿分配2D数组时,您应该首先分配指针的1D数组。 在您的代码中,应该是:

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

然后为每个指针分配G->V向量:

#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;
}
(i=0;iV;i++)的

{
G->Adj[i]=(int*)malloc(sizeof(int)*G->V);
}
此外,一个好的实践是验证每个分配的分配结果不为NULL(malloc failure)

有关c向量分配的一般说明,请参阅

除此之外,程序末尾缺少内存释放,因此您应该以相反的顺序(向量和指针)添加对free()的调用 #包括 结构图{ INTV; INTE; int**Adj; }; 结构图*adjMatrix(){ int u,v,i; 结构图*G; G=malloc(sizeof(结构图)); if(!G){ printf(“内存错误!\n”); 返回0; } printf(“输入节点数和边数:\n”); 扫描频率(“%d%d”,&G->V,&G->E); //第一个问题是,这是如何动态分配2D数组 G->Adj=malloc((G->V)*sizeof(int*); 对于(u=0;uV;u++) G->Adj[u]=malloc((G->V)*sizeof(int)); 对于(u=0;uV);u++) 对于(v=0;vV);v++) G->Adj[u][v]=0;//这会导致分段错误。 //我在这里添加了一些调整来帮助您 printf(“成对输入连接边缘的节点编号:\n”); 对于(i=0;iE);i++){ scanf(“%d%d”、&u和&v); 如果(u>=G->V | V>=G->V){ printf(“错误,请提供正确的输入\n”); 我--;} 否则{ G->Adj[u][v]=1; G->Adj[v][u]=1;} } 回报率(G); } int main(){ 结构图*G; int i,j,计数=0; G=调整矩阵(); 对于(i=0;iV;i++){ 对于(j=0;jV;j++){ printf(“%d”,G->Adj[i][j]); 计数++; } 如果(计数==G->V) printf(“\n”); } 返回0; }
这是不可读的。你介意正确缩进吗?可能是重复的,不是2D数组。这是指向一维数组的指针数组。看,这是一个观点问题。对于被询问的2D数组,连续内存是不相关的,因此应答方法也可以这样使用。就像你在链接末尾回答的那样,“C没有多维数组”。但是无论如何,那里的分配方法当然也是有效的。这两种方法都不会出现分段错误,并且在这里起到相同的作用
G->Adj=malloc((G->V)*sizeof(int));
无效。你的意思是它应该是sizeof(int*)?因为它们都是4号
它们都是4号
-它们可以都是4号。如果
CHAR\u BIT=8
,那么
sizeof(int)
必须至少是2号,但这至少是2号,所以可以是2号,3号,4号,8号。
sizeof(int*)
是一个int指针的大小,在32位体系结构上它可以是4,但在64位上它是8,在具有256字节ram的8位处理器上它将是1。假设
sizeof(type)
的输出是不好的(可能除了
sizeof(char)
for(i=0; i < G->V; i++) 
{
    G->Adj[i] = (int *)malloc(sizeof(int)*G->V);
}
#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;
}