Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why is this wrong!? Generating strings

I've been trying to generate strings in this way:

a

b

.

.

z

aa

ab

.

.

zz

.

.

.

.

zzzz

And I want to know why Segmentation fault (core dumped) error is prompted when it reaches 'yz'. I know my code don't cover all the posibles strings like 'zb' or 'zc', but that's not all the point, I want to know why this error. I am not a master in coding as you see so please try to explain it clearly. Thanks :)

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>

void move_positions (char s[]);

int main (int argc, char *argv[])
{
    char s[28]; 
    s[0] = ' ';
    s[1] = '\0';
    int a = 0;
    for(int r = 'a'; r <= 'z'; r++)
    {
        for(int t ='a';t <='z'; t++)
        {   
            for(int u = 'a';u <= 'z'; u++)
            {   
                for(int y = 'a'; y <= 'z'; y++)                                    
                {                                          
                    s[a] = (char)y;  
                    printf ("%s\n", s);                                                                    
                    if (s[0] == 'z')
                    {                                                                                      
                        move_positions(s);
                        a++;
                    } 
                }
                s[a-1] = (char)u;
            }
            s[a-2] = (char)t;
        }
        s[a-3] = (char)r;
    }
return 0;
}


void move_positions (char s[])
{
    char z[28];
    z[0] = ' ';
    z[1] = '\0';
    strcpy(s, strcat(z, s));
}
like image 645
user1830562 Avatar asked Feb 05 '26 13:02

user1830562


1 Answers

First, let's compile with debugging turned on:

gcc -g prog.c -o prog

Now let's run it under a debugger:

> gdb prog
GNU gdb 6.3.50-20050815 (Apple version gdb-1822) (Sun Aug  5 03:00:42 UTC 2012)
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "x86_64-apple-darwin"...Reading symbols for shared libraries .. done

(gdb) run
Starting program: /Users/andrew/Documents/programming/sx/13422880/prog 
Reading symbols for shared libraries +............................. done
a
b
c
d
e
...

yu
yv
yw
yx
yy
yz

Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_INVALID_ADDRESS at address: 0x00007fffc0bff6c5
0x0000000100000c83 in main (argc=1, argv=0x7fff5fbff728) at prog.c:22
22                      s[a] = (char)y;  

Ok, it crashed on line 22, trying to do s[a] = (char)y. What's a?

(gdb) p a
$1 = 1627389953

So you're setting the ~1.6 millionth entry of the array s. What is s?

(gdb) ptype s
type = char [28]

Saving 1.6 million entries in a 28-element array? That's not going to work. Looks like you need to reset a to zero at the start of some of your loops.

like image 142
andrewdotn Avatar answered Feb 09 '26 07:02

andrewdotn