Dynamic Memory Allocation - offset pointers

Reply

Join Date: Feb 2005
Posts: 2
Reputation: wu_weidong is an unknown quantity at this point 
Solved Threads: 0
wu_weidong wu_weidong is offline Offline
Newbie Poster

Dynamic Memory Allocation - offset pointers

 
0
  #1
Feb 24th, 2005
Hi all,
I am just learning DMA, and am supposed to write 2 functions utilizing the offset technique, such that a 2-D array starts and ends the index of each dimension as the user specifies.

matrix(): creates a 2D array of float type numbers, indexing from -n to n for each dimension. A proper pointer is to be returned so that after invocation of this function, a 2D array of float type numbers and the specified starting and ending indices can be used.
free_matrix(): releases the memory allocated for the 2D array created by matrix().

I am using C, and use a UNIX-based compiler to run my program. Below is what I have:

#include <stdio.h>
#include <stdlib.h>
float** matrix(float **x, int n);
void free_matrix(float **x, int n);
int main(void)
{
   float **x;
   int i, j, n;
   scanf("%d", &n);
   x = matrix(x, n);
   for (i = -n ; i <= n ; i++)
   {
       for (j = -n ; j <= n ; j++)
          x[i][j] = i + j;
   }
   for (i = -n ; i <= n ; i++)
   {
       for (j = -n ; j <= n ; j++)
       printf("%f ", x[i][j]);
       printf("\n");
   }   
   free_matrix(x, n);
   return 0;
}
 
float** matrix(float **x, int n)
{
   int i;
   x = (float**) malloc(2 * n * sizeof(float*));
   for (i = 0 ; i < n ; i++)
   {
      x[i] = (float*) malloc(2 * n * sizeof(float));
      x[i] -= n;
   }
   x -= n;
   return x;
}

void free_matrix(float **x, int n)
{
   int i;
   x += n;
   for (i = 0 ; i < n ; i++)
      free(x[i] + n);
   free(x);
}

I keep getting the error "Segmentation fault". What is wrong with my code?

All those in blue were given in the question, so I can't change any of that. I followed the code to create the array closely with that given in my notes, which showed how to create a 2D array.

On a similar matter, I was able to create a 1D array (with starting and ending indices as -n and n respectively), but had problems freeing the memory. My function to free the memory was
void free_vector(float *x, int n)
{
free(x + n);
}
but I got the same "Segmentation Fault" error. What is wrong?

Thank you.

Regards,
Rayne
Last edited by alc6379; Feb 28th, 2005 at 5:35 pm.
Reply With Quote Quick reply to this message  
Join Date: May 2004
Posts: 256
Reputation: FireNet will become famous soon enough FireNet will become famous soon enough 
Solved Threads: 6
FireNet's Avatar
FireNet FireNet is offline Offline
Posting Whiz in Training

Re: Dynamic Memory Allocation - offset pointers

 
0
  #2
Feb 24th, 2005
x = (float**) malloc(2 * n * sizeof(float*));

That's the problem I belive, why the 2? ,just put n like

x = (float**) malloc(n * sizeof(float*));

Then try.......

Also put in debug lines following each step,that way you can quickly find out where the problems are....


And this is really weird for (i = -n ; i <= n ; i++), I belive it's a mistake, it should be for (i = 0 ; i < n ; i++)
See what you can, remember what you need

Fourzon | Earn via Coding
Reply With Quote Quick reply to this message  
Reply

This thread is more than three months old.
Perhaps start a new thread instead?
Message:


Thread Tools Search this Thread



About Us | Contact Us | Advertise | DaniWeb | Acceptable Use Policy | RSS Feed

©2003 - 2009 DaniWeb® LLC