【问题标题】:Stack smashing in Scrabble mini game program拼字游戏小游戏程序中的堆栈粉碎
【发布时间】:2017-04-11 06:05:54
【问题描述】:

下面是一个名为 scrabble.c 的程序的代码片段,该程序用于玩游戏的简化版本。用户被处理 7 个随机字符,然后被告知使用这些字符输入一个单词。我遇到了接受用户输入并将其存储在数组中的函数的问题。

这个函数应该提示用户输入一个单词,然后读取它,并将它逐个字符地存储在数组“word”中。该函数还应返回用户输入的单词的大小(输入的字母数)。

int read_word(char word[7], int max_size_word)
{
int c = 0, input_count = 0;
printf("Please enter your word : ");

char user_input = getchar();
for(c = 0; c < max_size_word; c++)
{
    if(user_input != '\n')
    {
    word[input_count] = user_input; 
    input_count++;
    printf("input_count = %d, letter entered = %c\n", input_count, 
user_input);
    }
    else if(user_input == '\n')
    {
    return input_count;
    }
    user_input = getchar();
}
return input_count;

// 错误发生在这里。错误:检测到堆栈粉碎。/scrabble 终止了已中止的核心转储。”

为什么会检测到堆栈粉碎?

}

int main(void)
{
int t;
int letter_set[7] = {0};
char word[7];
int size_letter_set = 100;
int num_letters = 7;

generate_letter_set(&letter_set[7], size_letter_set, num_letters);
read_word(&word[7], 7);
printf("printing word : ");

for(t=0; t < 7; t++)
{
    printf("%c", word[t]);
}
    printf("\n");


 return 0;
 }

【问题讨论】:

    标签: c


    【解决方案1】:

    你同时调用函数:

    &letter_set[7]
    &word[7]
    

    这是一个指向 7 个 int/character 数组中的第八个 int/character 的指针。调用函数时只需使用letter_setword。当您的代码开始写入数组时,您的堆栈可能会被破坏。同样,函数原型会更好:

    int read_word(char word[], int max_size_word)
    

    7 并没有做任何特别的事情,所以把它放下。

    【讨论】:

      【解决方案2】:

      问题来了

      read_word(&word[7], 7);
      

      您传递给read_word 的地址不是您可能想到的大小为7 的数组word 的地址,而是word[7] 的地址,它指向@987654325 的第8 个 字符@ 超出了边界。

      要传递数组地址,请编写以下内容:

      read_word(&word[0], 7);
      

      read_word(word, 7);
      

      generate_letter_set(&amp;letter_set[7], size_letter_set, num_letters);也是如此

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多