By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
454,446 Members | 1,317 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 454,446 IT Pros & Developers. It's quick & easy.

Segmentation Fault

P: 3
Let me state my problem.

This is my main.c

Expand|Select|Wrap|Line Numbers
  1.  
  2. #include <stdio.h>
  3. #include "includes/first_order_local_matrix.h"
  4.  
  5. int main()
  6. {
  7.         float eps = 1;
  8.  
  9.         struct vector *x, *y, *rho, *q;
  10.         struct matrix *P;
  11.  
  12.         initialize_vector(x,3);
  13.         initialize_vector(y,3);
  14.         initialize_vector(rho,3);
  15.  
  16.         x->values[0] = 0;
  17.         x->values[1] = 2;
  18.         x->values[2] = 0;
  19.         y->values[0] = 0;
  20.         y->values[1] = 0;
  21.         y->values[2] = 1;
  22.         rho->values[0] = 3;
  23.         rho->values[1] = 3;
  24.         rho->values[2] = 3;
  25.  
  26.         first_order_local_matrix(x,y,rho,eps,P,q);
  27.  
  28. }
  29.  
  30.  
and I have declared the structure vector as follows:

Expand|Select|Wrap|Line Numbers
  1.  
  2. struct vector
  3. {
  4.         float *values;
  5.         int length;
  6. };
  7.  
  8.  
and the definition for the initialize_vector() function is as follows:

Expand|Select|Wrap|Line Numbers
  1.  
  2. void initialize_vector(struct vector *vector_to_be_initialized, int length)
  3. {
  4.         printf("Initializing Vector\n");
  5.  
  6.         vector_to_be_initialized -> length= length;
  7.         vector_to_be_initialized -> values = malloc(length * sizeof(float));
  8.  
  9.         printf("Initialized Vector\n");
  10.  
  11.  
and finally this is the code for the first_order_local_matrix() function:

Expand|Select|Wrap|Line Numbers
  1.  
  2. void first_order_local_matrix(struct vector *x, struct vector *y, struct vector *rho, float epsilon, struct matrix *P, struct vector *q)
  3. {
  4.  
  5.         struct vector *b, *c;
  6.  
  7.         float area;
  8.         int ii,jj,dim;
  9.  
  10.         dim = x->length;
  11.  
  12.         initialize_vector(b, dim);
  13.         initialize_vector(c, dim);
  14.         initialize_vector(q, dim);
  15.         initialize_matrix(P, dim,dim);
  16.  
  17.         area = triangle(x,y,b,c);
  18.  
  19.         for(ii=0; ii<dim; ii++)
  20.         {
  21.                 for(jj=0; jj<dim; jj++)
  22.                         P->values[ii][jj] = epsilon*area*(b->values[ii]*b->values[jj] + c->values[ii]*c->values[jj]);
  23.  
  24.                 q->values[ii] = area*(2*rho->values[ii] + rho->values[mod(ii,3)+1] + rho->values[mod(mod(ii,3)+1,3)+1])/12;
  25.         }
  26. }
  27.  
  28.  
The problem is that the first 3 calls for the initialize_vector() from main() goes well. But when the initalize_vector() is called from first_order_local_matrix() I get a segmentation fault.

Any clues on what I am doing wrong here?

Thanks in advance.
Apr 27 '07 #1
Share this Question
Share on Google+
5 Replies


Expert 100+
P: 181
Let me state my problem.

This is my main.c

Expand|Select|Wrap|Line Numbers
  1.  
  2. #include <stdio.h>
  3. #include "includes/first_order_local_matrix.h"
  4.  
  5. int main()
  6. {
  7.         float eps = 1;
  8.  
  9.         struct vector *x, *y, *rho, *q;
  10.         struct matrix *P;
  11.  
  12.         initialize_vector(x,3);
  13.         initialize_vector(y,3);
  14.         initialize_vector(rho,3);
  15.  
  16.         x->values[0] = 0;
  17.         x->values[1] = 2;
  18.         x->values[2] = 0;
  19.         y->values[0] = 0;
  20.         y->values[1] = 0;
  21.         y->values[2] = 1;
  22.         rho->values[0] = 3;
  23.         rho->values[1] = 3;
  24.         rho->values[2] = 3;
  25.  
  26.         first_order_local_matrix(x,y,rho,eps,P,q);
  27.  
  28. }
  29.  
  30.  
and I have declared the structure vector as follows:

Expand|Select|Wrap|Line Numbers
  1.  
  2. struct vector
  3. {
  4.         float *values;
  5.         int length;
  6. };
  7.  
  8.  
and the definition for the initialize_vector() function is as follows:

Expand|Select|Wrap|Line Numbers
  1.  
  2. void initialize_vector(struct vector *vector_to_be_initialized, int length)
  3. {
  4.         printf("Initializing Vector\n");
  5.  
  6.         vector_to_be_initialized -> length= length;
  7.         vector_to_be_initialized -> values = malloc(length * sizeof(float));
  8.  
  9.         printf("Initialized Vector\n");
  10.  
  11.  
and finally this is the code for the first_order_local_matrix() function:

Expand|Select|Wrap|Line Numbers
  1.  
  2. void first_order_local_matrix(struct vector *x, struct vector *y, struct vector *rho, float epsilon, struct matrix *P, struct vector *q)
  3. {
  4.  
  5.         struct vector *b, *c;
  6.  
  7.         float area;
  8.         int ii,jj,dim;
  9.  
  10.         dim = x->length;
  11.  
  12.         initialize_vector(b, dim);
  13.         initialize_vector(c, dim);
  14.         initialize_vector(q, dim);
  15.         initialize_matrix(P, dim,dim);
  16.  
  17.         area = triangle(x,y,b,c);
  18.  
  19.         for(ii=0; ii<dim; ii++)
  20.         {
  21.                 for(jj=0; jj<dim; jj++)
  22.                         P->values[ii][jj] = epsilon*area*(b->values[ii]*b->values[jj] + c->values[ii]*c->values[jj]);
  23.  
  24.                 q->values[ii] = area*(2*rho->values[ii] + rho->values[mod(ii,3)+1] + rho->values[mod(mod(ii,3)+1,3)+1])/12;
  25.         }
  26. }
  27.  
  28.  
The problem is that the first 3 calls for the initialize_vector() from main() goes well. But when the initalize_vector() is called from first_order_local_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_vector(x,3);
initialize_vector(y,3);
initialize_vector(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_local_matrix() as well.

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

P: 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
Apr 27 '07 #3

100+
P: 256
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.
Apr 27 '07 #4

P: 3
In that case, what is the differnce between

Expand|Select|Wrap|Line Numbers
  1. x = (struct vector *)malloc(sizeof(struct vector *))
  2.  
and

Expand|Select|Wrap|Line Numbers
  1. x = (struct vector *)malloc(sizeof(struct vector))
  2.  
i.e. under what circumstance would you want to allocate space corresponding to a pointer?
Apr 27 '07 #5

100+
P: 256
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:
Expand|Select|Wrap|Line Numbers
  1. printf( "sizeof struct vector: %d\n", sizeof( struct vector));
  2. 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).
May 3 '07 #6

Post your reply

Sign in to post your reply or Sign up for a free account.