These segmentation faults are making me feel very humble about my C skills. I have a feeling I don't remember something here.
Code:
(gdb) run
Starting program: /home/eugene/cfiles/a.out
Program received signal SIGSEGV, Segmentation fault.
0x08048495 in string2list (sPtr=0xbf8bbdf0, string=0xbf8be000 <Address 0xbf8be000 out of bounds>) at 12.9.c:62
62 insert( sPtr, *string );
Code:
#include <stdio.h>
#include <stdlib.h>
struct listnode {
char data;
struct listnode *nextPtr;
};
typedef struct listnode ListNode;
void insert( ListNode **sPtr, char input );
void display( ListNode *sPtr );
void string2list( ListNode **sPtr, char *string );
int main()
{
ListNode *startPtr = NULL;
char string[ 10 ] = "a test";
string2list( &startPtr, string );
// insert( &startPtr, 'q' );
// insert( &startPtr, 'z' );
// insert( &startPtr, 'a' );
display( startPtr );
return 0;
}
void string2list( ListNode **sPtr, char string[] )
{
while ( string != '\0' ) {
insert( sPtr, *string );
++string;
}
}
void display( ListNode *sPtr )
{
ListNode *currentPtr = NULL;
currentPtr = sPtr;
while ( currentPtr != NULL ) {
printf( "%c", currentPtr->data );
currentPtr = currentPtr->nextPtr;
}
printf( "\n" );
}
void insert( ListNode **sPtr, char input )
{
ListNode *newPtr = NULL, *previousPtr = NULL, *currentPtr = NULL;
newPtr = malloc( sizeof( ListNode ) );
if ( newPtr != NULL ) {
newPtr->data = input;
newPtr->nextPtr = NULL;
currentPtr = *sPtr;
while ( currentPtr != NULL ) {
previousPtr = currentPtr;
currentPtr = currentPtr->nextPtr;
}
if ( currentPtr == *sPtr ) {
newPtr->nextPtr = *sPtr;
*sPtr = newPtr;
}
else {
previousPtr->nextPtr = newPtr;
newPtr->nextPtr = currentPtr;
}
}
}