c – 在链接列表中查找循环(??获取分段错误)
发布时间:2020-12-16 09:45:40 所属栏目:百科 来源:网络整理
导读:该解决方案基于对计算机的非常重要的观察. 我系统中的指针大小为8个字节. 这个结构的大小 struct ll1 { int data; struct ll1 *next; }; 是16个字节. 作为具有多个成员的结构指针,将始终具有一些尾随零.这是由于内存对齐. 所以我试图使用剩下的4个字节来存储
该解决方案基于对计算机的非常重要的观察.
我系统中的指针大小为8个字节. 这个结构的大小 struct ll1 { int data; struct ll1 *next; }; 是16个字节. #include<stdio.h> #include<stdlib.h> struct ll1 { int data; struct ll1 *next; }; typedef struct ll1 ll; void create(ll **root) { int t=1; printf("nEnter node value 0 if end:"); scanf("%d",&t); if(t) { (*root)=(ll*)malloc(sizeof(ll)) ; (*root)->data=t; create(&(*root)->next); } else (*root)=NULL; } int main() { ll *node; create(&node); ll *temp=node,*temp2=node; int j,size=0; /*printing 4-4 bytes of the node */ while(temp->next) { size++; int *p=(int *)temp; printf("n%d %d %d %d",*(p),*(p+1),*(p+2),*(p+3)); *(p+3)=0; // setting the value of last four byte zero temp=temp->next; } printf("n"); j=size/3; /* making loop in the linklist */ while(j--)temp2=temp2->next; temp=node; while(temp->next!=NULL)temp=temp->next; temp->next=temp2; /*loop created */ /* code for finding loop in the linklist */ printf("nfinding loop in the linklistn"); ll *root=node; int *pp=(int *)root; printf("%d %d %d %dn",*(pp),*(pp+1),*(pp+2),*(pp+3)); printf("%d n",root->data); while(*(pp+3)==0) { *(pp+3)=1; //when changed that line by *(pp+3)=0 it doesn't give any error root=root->next; //move pointer to next pp=(int *)root; // assign adress to integer pointer printf("%d %d %d %dn",*(pp+3)); // segmentation fault is here printf("%d n",root->data); } printf("%d n",root->data); return 0; } GDB中的输出 (gdb) r Starting program: /home/kushagra/place/linklist/a.out <ll_in Enter node value 0 if end:1 Enter node value 0 if end:2 Enter node value 0 if end:3 Enter node value 0 if end:4 Enter node value 0 if end:5 Enter node value 0 if end:6 Enter node value 0 if end:7 Enter node value 0 if end:8 Enter node value 0 if end:8 Enter node value 0 if end:0 1 0 6299696 0 2 0 6299728 0 3 0 6299760 0 4 0 6299792 0 5 0 6299824 0 6 0 6299856 0 7 0 6299888 0 8 0 6299920 0 8 0 6299952 0 finding loop in the linklist 1 0 6299696 0 1 Program received signal SIGSEGV,Segmentation fault. 0x0000000000400a2e in main () at P_node.c:72 72 printf("%d %d %d %dn",*(pp+3)); // segmentation fault is here 解决方法
它没有’尾随零’.它可能在int和指针之间有4个未使用的字节.
这*(pp 3)= 1可能修改指针内的四个字节. 使用: struct ll1 { int data; int visited; struct ll1 *next; }; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |