Boston Linux & Unix (BLU) Home | Calendar | Mail Lists | List Archives | Desktop SIG | Hardware Hacking SIG
Wiki | Flickr | PicasaWeb | Video | Maps & Directions | Installfests | Keysignings
Linux Cafe | Meeting Notes | Linux Links | Bling | About BLU

BLU Discuss list archive


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Segmentation fault



On Sun, 6 Feb 2000, Mark Donnelly wrote:

> Seg faults: the wonderful, wonderful sign of memory leaks.  aaahhhh..
> 
> You're probably doing one of two things: first, you might be allocating
> memory and forgetting to free it again when you are finished (less
> likely), or using some bit of memory before you allocate it (more likely).

On that note, I've got a peice of code that permutes a string into all its
permutations.  I've been baffled by the fact that it segfaults on the call
to free() a block I've allocated to hold a permutation, if the string is
larger than 12 characters. If any of you ace hackers has an explanation
for this, I'd love to hear it.  

I first thought I was smashing the stack, until I ran the program and saw
that it goes through thousands of permutations before it finally
segfaults, and the depth of the stack isn't any deeper at that point than
at earlier points.  Then I ran the code through the debugger, and saw that
it was segfaulting in the free( temp ) call.  This makes NO sense to me at
all.

BTW, this code works great if the strlen < 12...

Here's the code:


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "permute.h"

int
permutation( char *string, char *done )
{

  int i, j, len;
  char *temp; 
  char *done_so_far;
  char charcurrent[2];

  len = strlen( string );
  charcurrent[1] = '\0';

  if ( len == 1 ){
    printf( "%s%s\n", done, string );
    return 0;
  }

  else {

    /* store the string without the current char in temp */    
    temp = (char *)malloc( len * sizeof(char));
    done_so_far = (char *)malloc( strlen( done ) + 2);
   
    for ( i = 0; i < len; i++ ) {
      strcpy( done_so_far, done );
      strcpy( temp, string );
      temp = rest_of_string( temp, i );
      charcurrent[0] = string[i];
      strcat( done_so_far, charcurrent );

      /* do the recursive call with the placeholder */
      permutation( temp, done_so_far );
    }

    /* forgetting to do this causes a HUGE memory leak */
    /* as the size of the string(s) grows              */
    free(temp);
    free(done_so_far);
    
    return 0;
  }
  
}


char *
rest_of_string( char *string, int usedchar )
{
  
  string[usedchar] = '\0';
  strcat( string, (string + usedchar + 1) );
  return string;
  
}


heeellp meeee... <as I fall down an endless well of frustration>

-- 
"Quis custodiet ipsos custodes?"    "Who watches the watchmen?" 
-Juvenal, Satires, VI, 347 

Derek D. Martin      |  Senior UNIX Systems/Network Administrator
Arris Interactive    |  A Nortel Company
derekm at mediaone.net  |  dmartin at ne.arris-i.com
-------------------------------------------------

-
Subcription/unsubscription/info requests: send e-mail with
"subscribe", "unsubscribe", or "info" on the first line of the
message body to discuss-request at blu.org (Subject line is ignored).




BLU is a member of BostonUserGroups
BLU is a member of BostonUserGroups
We also thank MIT for the use of their facilities.

Valid HTML 4.01! Valid CSS!



Boston Linux & Unix / webmaster@blu.org