Segmentation Fault

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • mprathap
    New Member
    • Apr 2007
    • 3

    Segmentation Fault

    Let me state my problem.

    This is my main.c

    Code:
    #include <stdio.h>
    #include "includes/first_order_local_matrix.h"
    
    int main()
    {
            float eps = 1;
    
            struct vector *x, *y, *rho, *q;
            struct matrix *P;
    
            initialize_vector(x,3);
            initialize_vector(y,3);
            initialize_vector(rho,3);
    
            x->values[0] = 0;
            x->values[1] = 2;
            x->values[2] = 0;
            y->values[0] = 0;
            y->values[1] = 0;
            y->values[2] = 1;
            rho->values[0] = 3;
            rho->values[1] = 3;
            rho->values[2] = 3;
    
            first_order_local_matrix(x,y,rho,eps,P,q);
    
    }
    and I have declared the structure vector as follows:

    Code:
    struct vector
    {
            float *values;
            int length;
    };
    and the definition for the initialize_vect or() function is as follows:

    Code:
    void initialize_vector(struct vector *vector_to_be_initialized, int length)
    {
            printf("Initializing Vector\n");
    
            vector_to_be_initialized -> length= length;
            vector_to_be_initialized -> values = malloc(length * sizeof(float));
            
            printf("Initialized Vector\n");
    }
    and finally this is the code for the first_order_loc al_matrix() function:

    Code:
    void first_order_local_matrix(struct vector *x, struct vector *y, struct vector *rho, float epsilon, struct matrix *P, struct vector *q)
    {
    
            struct vector *b, *c;
    
            float area;
            int ii,jj,dim;
    
            dim = x->length;
    
            initialize_vector(b, dim);
            initialize_vector(c, dim);
            initialize_vector(q, dim);
            initialize_matrix(P, dim,dim);
    
            area = triangle(x,y,b,c);
    
            for(ii=0; ii<dim; ii++)
            {
                    for(jj=0; jj<dim; jj++)
                            P->values[ii][jj] = epsilon*area*(b->values[ii]*b->values[jj] + c->values[ii]*c->values[jj]);
    
                    q->values[ii] = area*(2*rho->values[ii] + rho->values[mod(ii,3)+1] + rho->values[mod(mod(ii,3)+1,3)+1])/12;
            }
    }
    The problem is that the first 3 calls for the initialize_vect or() from main() goes well. But when the initalize_vecto r() is called from first_order_loc al_matrix() I get a segmentation fault.

    Any clues on what I am doing wrong here?

    Thanks in advance.
  • svlsr2000
    Recognized Expert New Member
    • Feb 2007
    • 181

    #2
    Originally posted by mprathap
    Let me state my problem.

    This is my main.c

    Code:
    #include <stdio.h>
    #include "includes/first_order_local_matrix.h"
    
    int main()
    {
            float eps = 1;
    
            struct vector *x, *y, *rho, *q;
            struct matrix *P;
    
            initialize_vector(x,3);
            initialize_vector(y,3);
            initialize_vector(rho,3);
    
            x->values[0] = 0;
            x->values[1] = 2;
            x->values[2] = 0;
            y->values[0] = 0;
            y->values[1] = 0;
            y->values[2] = 1;
            rho->values[0] = 3;
            rho->values[1] = 3;
            rho->values[2] = 3;
    
            first_order_local_matrix(x,y,rho,eps,P,q);
    
    }
    and I have declared the structure vector as follows:

    Code:
    struct vector
    {
            float *values;
            int length;
    };
    and the definition for the initialize_vect or() function is as follows:

    Code:
    void initialize_vector(struct vector *vector_to_be_initialized, int length)
    {
            printf("Initializing Vector\n");
    
            vector_to_be_initialized -> length= length;
            vector_to_be_initialized -> values = malloc(length * sizeof(float));
            
            printf("Initialized Vector\n");
    }
    and finally this is the code for the first_order_loc al_matrix() function:

    Code:
    void first_order_local_matrix(struct vector *x, struct vector *y, struct vector *rho, float epsilon, struct matrix *P, struct vector *q)
    {
    
            struct vector *b, *c;
    
            float area;
            int ii,jj,dim;
    
            dim = x->length;
    
            initialize_vector(b, dim);
            initialize_vector(c, dim);
            initialize_vector(q, dim);
            initialize_matrix(P, dim,dim);
    
            area = triangle(x,y,b,c);
    
            for(ii=0; ii<dim; ii++)
            {
                    for(jj=0; jj<dim; jj++)
                            P->values[ii][jj] = epsilon*area*(b->values[ii]*b->values[jj] + c->values[ii]*c->values[jj]);
    
                    q->values[ii] = area*(2*rho->values[ii] + rho->values[mod(ii,3)+1] + rho->values[mod(mod(ii,3)+1,3)+1])/12;
            }
    }
    The problem is that the first 3 calls for the initialize_vect or() from main() goes well. But when the initalize_vecto r() is called from first_order_loc al_matrix() I get a segmentation fault.

    Any clues on what I am doing wrong here?

    Thanks in advance.
    Fault 1:
    struct vector *x, *y, *rho, *q;
    struct matrix *P;

    initialize_vect or(x,3);
    initialize_vect or(y,3);
    initialize_vect or(rho,3);
    your not intializing pointer here.
    use x = (struct vector *)malloc(sizeof (struct vector));
    before using pointer x. this holds good for other pointers as well

    Fault 2:
    your are doing same mistake in function first_order_loc al_matrix() as well.

    i don't know why its not crashing at first place itself. :(
    if any one know do tell me.

    Comment

    • mprathap
      New Member
      • Apr 2007
      • 3

      #3
      Thanks for the reply budy. I fixed the problem. I was in Java for quite sometime and these subtle things in C are screwing me up grandly [:D]

      I have one more question:

      You said I should use x = (struct vector *)malloc(sizeof (struct vector));

      But should it not be x = (struct vector *)malloc(sizeof (struct vector *)) since x is a pointer.

      But both of them seem to work fine. So which one is technically correct? Plus why is it required to coerce it by typecasting as (struct vector *). Isn't it something redundant?

      Thanks in advance.

      Prathap

      Comment

      • mac11
        Contributor
        • Apr 2007
        • 256

        #4
        Originally posted by mprathap
        But should it not be x = (struct vector *)malloc(sizeof (struct vector *)) since x is a pointer.
        you want enough memory for your structure not enough memory for a pointer to your structure

        Plus why is it required to coerce it by typecasting as (struct vector *). Isn't it something redundant?
        malloc just returns a void* to your new memory (is just a chunk and says nothing abut how it is to be used/divided up). malloc knows nothing about what the memory is for, only how big the chunk is. You use the typecast to define how that memory is used (how its shaped or divided up) - your saying that the memory is memory for your vector structure.

        Comment

        • mprathap
          New Member
          • Apr 2007
          • 3

          #5
          In that case, what is the differnce between

          Code:
          x = (struct vector *)malloc(sizeof(struct vector *))
          and

          Code:
          x = (struct vector *)malloc(sizeof(struct vector))
          i.e. under what circumstance would you want to allocate space corresponding to a pointer?

          Comment

          • mac11
            Contributor
            • Apr 2007
            • 256

            #6
            under what circumstance would you want to allocate space corresponding to a pointer?
            I can't think of a time when I malloc'd space for a pointer. There may be a situation where this is desired, I just can't think of one.

            If your still foggy on the subject, try this:
            Code:
            printf( "sizeof struct vector: %d\n", sizeof( struct vector));
            printf( "sizeof struct vector *: %d\n", sizeof( struct vector*));
            The pointer is only large enough to hold an address. The structure is large enough to hold what it's made up of (an int, and a pointer for floats).

            Comment

            Working...