gpt4 book ai didi

c - 初始化带有数组的结构时出现段错误

转载 作者:太空宇宙 更新时间:2023-11-04 03:33:07 25 4
gpt4 key购买 nike

我正在用 C 编写一个 ncurses 拼字游戏的克隆。

我已经编写了一些代码来表示一个袋子,它是一个洗牌字符的来源,您可以从中拉出字符,就像在现实生活中从袋子中随机抽取瓷砖一样。

我的代码可以在 OS X 上运行——但是当我尝试在 Debian 机器上编译时,它给了我这个直截了当的信息:

~/nscrabble $ ./scrabble
Segmentation fault

我已经使用 gdb 来尝试诊断问题。段错误似乎是由 return 语句引起的:

(gdb) run
Starting program: /home/jay/nscrabble/scrabble

Program received signal SIGSEGV, Segmentation fault.
0x0000000000400ca8 in bag () at bag.c:53
53 return b;
(gdb)

给你。这是代码(bag.cbag.h)这是 bag.h --

#ifndef BAG_H_INCLUDED
#define BAG_H_INCLUDED

/*
* This array states how many times each
* letter should show up in the bag.
*
* distributions[0] Number of As
* distributions[1] Number of Bs
* ...
* distributions[25] Number of Zs
* distributions[26] Number of blank tiles
*/
const short distributions[27];

/*
* The bag is the repository of tiles in Scrabble.
* I didn't want to deal with storing pointers
* and freeing them constantly, so I decided to
* store chars.
*/
typedef struct bag {
char tiles[100];
size_t top;

/*
* Get a tile letter out of the bag.
* It removes the letter from the bag.
*/
char (*pop)( struct bag* );
} bag_t;

/*
* The constructor.
* Get a new bag using this.
*/
struct bag bag();



char bg_pop( struct bag* );

#endif

这是 bag.c --

#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include "bag.h"

const short distributions[27] = {
9, 2, 2, 4, 12, 2, 3, 2, 9, 1, 1, 4, 2, 6, 8, 2, 1,
6, 4, 6, 4, 2, 2, 1, 2, 1, 2
};

char bg_pop( struct bag* b )
{
return b->tiles[b->top--];
}

struct bag bag()
{
struct bag b;
for( char letter = 'A', count = 0; letter <= ']'; letter++ ) {
for(int i = 0; i < distributions[letter - 65]; i++, count++)
b.tiles[count] = letter;
}
srand( time(NULL) );
for( int i = 0; i < 3; i++, rand() )
;
for( int i = 0; i < 98; i++ ) {
int n = (rand() % (100 - i)) + i;
char temp = b.tiles[i];
b.tiles[i] = b.tiles[n];
b.tiles[n] = temp;
}
b.top = 100;
b.pop = bg_pop;
return b;
}

拼字游戏.c:

#include <stdio.h>
#include "bag.h"

int main( int argc, const char** argv )
{
struct bag b = bag();

for( int i = 0; i < 100; i++ )
printf("%3c", b.tiles[i]);
}

我知道洗牌是正确完成的(至少在 OS X 上)。

有人可以帮助阐明这里发生的事情吗?

最佳答案

这里:

for( char letter = 'A', count = 0; letter <= ']'; letter++ ) {
for( int i = 0; i < distributions[ letter - 65 ]; i++, count++ ) {
b.tiles[count] = letter;
}
}

如果你打印出count的值您会看到它高达 152,远高于数组中的 100 个元素。你似乎是段错误,因为这会使 count在您的系统上变为负数,因为您已将其定义为 char ,已在您的系统上签名。

您可以将其定义为 int当我这样做时,段错误对我来说消失了,但你仍然在你的数组上越界,所以你使用 count 的逻辑显然有问题, 这里。或者,更有用的是,您有一对输出 152 个字母的循环,但您只为其中的 100 个保留了内存,所以您制作的字母多于您的空间。

如果你改变letter <= ']'letter <= '[' (因为 '[' 在 ASCII 表中紧跟在 'Z' 之后)然后你的循环正确退出一次 count达到 100,您应该准备就绪。

关于c - 初始化带有数组的结构时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34583304/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com