Segmentation fault (core dumped) C error for structures

Click For Summary

Discussion Overview

The discussion revolves around a C programming issue related to segmentation faults occurring when manipulating structures and arrays. Participants explore potential causes of the error, particularly focusing on the handling of random number generation and array indexing.

Discussion Character

  • Technical explanation
  • Debate/contested

Main Points Raised

  • One participant describes a segmentation fault occurring when attempting to print values from a structure array, suggesting the issue may be related to how the structure is accessed.
  • Another participant questions the use of drand48() instead of rand(), and asks about the maximum possible value generated by the expression (int)(drand48() * 10000).
  • A different participant points out a potential error in variable naming, noting that values are assigned to 'cplr' instead of 'plr', which could lead to memory issues.
  • One participant clarifies that the variable naming issue was not serious and explains that the code works after changing the assignment to cplr[i].n=r[i].
  • Another participant inquires about the maximum index of the array and the implications of the random number generation range.
  • A participant explains that drand48() generates a number between 0 and 1, and thus (int)(drand48() * 10000) results in values from 0 to 9999, which raises questions about array bounds.

Areas of Agreement / Disagreement

Participants express varying levels of agreement on the presence of multiple issues in the code, but there is no consensus on a single cause for the segmentation fault. The discussion remains unresolved regarding the exact nature of the problem.

Contextual Notes

There are unresolved questions regarding the proper handling of array indices and the implications of using different random number generation methods. The discussion highlights potential pitfalls in memory management and variable scope.

Fb.Researcher
Messages
9
Reaction score
0
I have written a C program that produce a structure, give it's elements their initial values and change these values when neccessary.I can compile my program but when I try to run it,error:"segmentation fault(core dumped)" appears.I commented different parts of my program and I underentood the problem is related to my structur.The code is:
Code:
#define PN 5000 //number of players I chose
#define RN 10 //number of array's rows
#define N number of array's columns 
enum logical {W,R};

main()
{
   int j=0,i=0,logic=R,r[100000]={0};
   struct plrrecord
   {
   int n;//identity number of the player
   short int lfstat;//life status: dead or alive
   short int ch[RN][N];
   };

   struct plrrecord plr[PN];


    while(   i<PN  ) 
   {
       r[i]=(int)(drand48() * 10000);
       for( j=0 ; j<i ; j++)		 
       {    if( r[j]==r[i] )logic=W;}  
       if( logic==R )
       {
            cplr[r[i]].n=r[i];
            i++;
       }
       else { logic = R; }
   }
   for(i=0;i<PN;i++)
        printf("%i\t",cplr[i].n);/****/
return 0;
}
In my program there are many players,I give to 5000 of them a number netween 0 to 10000
which should not be repeated.I check if their number is repeated in a "while-loop".The "logic" varible helps me here.If it's value is "R" then the number is not repeated.If it's vlue is "w" then I should chose another number.The array "r" saves the random numbers chsen before.
Now I think the error is related to the line with printf,I put a /****/ in that line,because when I comment this line thre is no error anymore.
What do you thik yhe problem is?
How do you think we can solve this problem?
 
Technology news on Phys.org
Plenty of problems, I doubt what you posted compiles.

Why do you use drand48() instead of a simple rand()? What is the maximum possible value of (int)(drand48()*10000)?
 
100% agree with Borek: there are just way too many problems with that code snippet.
 
I've forgotten more than I ever knew about C, but I do note that you define the player variable as 'plr' but then assign values to 'cplr'. Is that the kind of thing that might lead to pointers gleefully messing with memory?
 
The problem with calling plr instead of cplr was not serous,it happened when I was omitting extra rows of my program to make it simpler( I did it so that parts that are not related to the problem do not botter us)
The code is:
Code:
#include <stdio.h>
#include <stdlib.h>

#define PN 10 //number of players I chose
#define RN 10 //number of array's rows
#define N 2 //number of array's columns 
enum logical {W,R};

main()
{printf("Hi");
   int j=0,i=0,logic=R,r[100000]={0};
   struct plrrecord
   {
   int n;//identity number of the player
   short int lfstat;//life status: dead or alive
   short int ch[RN][N];
   };

   printf("environmental sourc:");
   struct plrrecord cplr[PN];


    while(   i<10  ) 
   {
       r[i]=(int)(drand48() * 10000);
       for( j=0 ; j<i ; j++)		 
       {    if( r[j]==r[i] )logic=W;}  
       if( logic==R )
       {
            cplr[i].n=r[i];
            i++;
       }
       else { logic = R; }
   }printf("%i\t",i);
   for(i=0;i<PN;i++)
        printf("%i\n",cplr[i].n);
return (0);
}

Now this works.When the program chose a player, the number of that player is kept in r[].At first it was :
Code:
cplr[r[i]].n=r[i]
I do not know why chnging it this way solved the problem because the length of the array,I mean r[],is 100000 which is more than the number of players.You see for chosing a player a number between 0 and 10000 is chosen. by saying cplr[r].n==r I change an element of array which is between 0 and 10000,And drand48() chose a random number between 0 and 1.Using drand48() instead of rand() is just one way of chosing a random varible.It may not be the easiest way, but it works.
 
What is the number of the last element in table[10000]? What is the maximum value of (int)(drand48() * 10000)?
 
Before changing the first program,a numer like r1 between 0 and 10000-1 was saved in the 9999th element of array so the array was chosen in a way so that always the program have an empty element for it.
dran48() gives a random number beween 0 and 1(not including 1 or a number in scale [0 1) ) so drand48()*10000 gives a random number between 0 and 10000 and (int)(drand48() * 10000 ) ranges from 0 to 9999 (including 9999 or an integer number in scale [0 9999])
 
Last edited:

Similar threads

  • · Replies 22 ·
Replies
22
Views
4K
Replies
12
Views
2K
Replies
2
Views
2K
  • · Replies 25 ·
Replies
25
Views
3K
  • · Replies 4 ·
Replies
4
Views
3K
  • · Replies 17 ·
Replies
17
Views
4K
  • · Replies 2 ·
Replies
2
Views
2K
Replies
1
Views
2K
  • · Replies 119 ·
4
Replies
119
Views
17K
  • · Replies 9 ·
Replies
9
Views
3K