此解决方案基于对计算机的非常重要的观察。 我系统中的指针大小为8个字节。 这个结构的大小
struct ll1
{
int data;
struct ll1 *next;
};
是16 bytes
。
作为具有多个成员的结构指针,将始终具有一些尾随零。这是由于内存对齐。
所以我试图使用剩下的4个字节来存储访问标志。
当我为这四个字节分配0时,它不会给出错误但是
当我指定除零以外的值时,它会在下面的代码中给出分段错误。
PLZ有人解释为什么会这样吗?
#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 linklist\n");
ll *root=node;
int *pp=(int *)root;
printf("%d %d %d %d\n",*(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 %d\n",*(pp),*(pp+1),*(pp+2),*(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 %d\n",*(pp),*(pp+1),*(pp+2),*(pp+3)); // segmentation fault is here
答案 0 :(得分:6)
它没有'尾随零'。它可能在int
和指针之间有4个未使用的字节。
这个*(pp+3)=1
可能会修改指针内的四个字节。
使用:
struct ll1
{
int data;
int visited;
struct ll1 *next;
};
答案 1 :(得分:1)
您没有检查是否已到达链接列表的末尾。你也应该检查一下。
while(*(pp+3)==0 && root->next)