3

私はこの方法で文字列を生成しようとしています:

a

b

.

.

z

ああ

ab

.

.

グーグー

.

.

.

.

zzzz

そして、'yz' に達したときにセグメンテーション違反 (コア ダンプ) エラーが表示される理由を知りたいです。私のコードが 'zb' や 'zc' のようなすべての可能性のある文字列をカバーしていないことは知っていますが、それだけではありません。このエラーの理由を知りたいです。ご覧のとおり、私はコーディングの達人ではないので、わかりやすく説明してください。ありがとう :)

#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));
}
4

1 に答える 1

1

まず、デバッグをオンにしてコンパイルしましょう。

gcc -g prog.c -o prog

それでは、デバッガーで実行してみましょう。

> 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、22 行目でクラッシュしましたs[a] = (char)y。なにa

(gdb) p a
$1 = 1627389953

したがって、配列の〜160万番目のエントリを設定していますs。とはs?

(gdb) ptype s
type = char [28]

28 要素の配列に 160 万のエントリを保存しますか? それはうまくいきません。a一部のループの開始時にゼロにリセットする必要があるようです。

于 2012-11-16T19:43:05.390 に答える