c - 变量周围的堆栈被指针算术损坏

标签 c stack

使用下面的代码,我总是会遇到“变量‘UserCode’周围的堆栈已损坏。

如果我没记错的话,当我这么做的时候userCode = (char*)malloc(sizeof(char)*N); ,它不应该创建一个大小为 char*n 的“数组”吗? ?我猜我的问题要么是我的数组声明,要么是我的指针算术。

任何帮助将不胜感激。

#include "stdafx.h"
#include <math.h>

int userPrompt1() {
    int numOfAlphabets = 0;
    printf("Please enter a number from 1 to 8 to choose how many alphabets you want\n");
        scanf_s(" %d", &numOfAlphabets);
        if (numOfAlphabets > 8 || numOfAlphabets < 0) {
            printf("Sorry! Invalid number entered. Try again. \n");
            numOfAlphabets = userPrompt1();
        }
        return numOfAlphabets;
}

int userPrompt2() {
    int numOfLetters = 0;
    printf("Please enter the number of letters you want to guess\n");
    scanf_s(" %d", &numOfLetters);
    if (numOfLetters < 0) {
        printf("Sorry! Invalid number entered. Try again. \n");
        numOfLetters = userPrompt2;
    }
    return numOfLetters;
}

int tryCalculator(int K, int N) {
    int tries = 0;
    tries = 1 + ceil(N * log2(K));
    return tries;
}

void codeGenerator(char codeGuessIn[], char letters[], int size) {
    for (int i = 0; i < size; i++) {
        int rando = rand() % size;
        codeGuessIn[i] = letters[rando];
        printf(" %c", codeGuessIn[i]);
    }
    printf("\n");
}

void codeChecker(char codeGuessIn[], char generatedCode[], int size) {
    int correctAlphabets = 0;
    for (int i = 0; i < size; i++) {
        if (codeGuessIn[i] == generatedCode[i]) {
            correctAlphabets++;
        }
    }
    printf(" %d in correct place \n", correctAlphabets);
}

void getUserCode(int size, char *userCode[]) {
    for (int i = 0; i < size; i++) {
        printf("Please enter letter #%d \n", i+1);
        getchar();
        scanf_s(" %c", &userCode[i]);
    }
}


int main(void)
{
    char letters[8] = { 'A','B','C','D','E','F','G','H' };
    char *generatedCode;    //array to hold generated code
    char *userCode;         // array to hold generated code.
    int K = userPrompt1();  //how many different alphabets in code
    int N = userPrompt2();  //how many letters in code
    int tries = tryCalculator(K, N);
    //int gameEnd = 1;

    userCode = (char*)malloc(sizeof(char)*N);
    generatedCode = (char*)malloc(sizeof(char)*N);
    codeGenerator(generatedCode, letters, N);
    getUserCode(N, &userCode);
    //codeChecker(userCode, generatedCode, N);


    return 0;
}

最佳答案

void getUserCode(int size, char *userCode[]) {
    scanf_s(" %c", &userCode[i]);

在这里,userCode[i]char * (指向字符的指针),&userCode[i]char ** (指针到指针到字符),以及 scanf("%c")预计 char * 。一个好的编译器会对此发出警告。

我认为你在这里想做的事情是这样的:

void getUserCode(int size, char *userCode) {
    scanf_s(" %c", &userCode[i]);
}
int main(void) {
    char *userCode = malloc(N);
    getUserCode(N, userCode);
}

printf() , getchar() , scanf()这里的组合散发着 scanf 所造成的坏习惯的味道。 :您将丢弃用户输入的第一个字符,因为您依赖输入缓冲区中的额外字符。 请参阅http://c-faq.com/stdio/scanfprobs.html并使用 fgets() 读取整行输入而不是使用scanf()

另外,

int userPrompt2() {
    int numOfLetters = 0;
    ...
        numOfLetters = userPrompt2;
}

您正在将函数指针分配给 int。 (普通的编译器应该对此发出警告。)如果这里的想法是再次调用该函数以重复提示,以防用户输入一些愚蠢的内容,那么无论如何使用循环而不是递归调用可能是更好的主意。

关于c - 变量周围的堆栈被指针算术损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44477945/

相关文章:

c - 删除 C 中重复的整数对的有效方法

c - 如何访问Postgresql c语言函数中的大对象?

c - 如何在 omnet.ini 文件中查找 manetRouter 的可用参数列表

c - 从堆栈读取时出现段错误

amazon-web-services - Terraform - 一种集中状态或多种模块化状态

c - 是否可以仅使用指向结构的指针(无数据类型)来实现堆栈?

c - 为什么这段代码没有给出所需的输出?

c - 宏中的双斜线注​​释替换

c - gdb print 或 stack alloc 有什么问题?

java - 为什么 Char 变量在没有声明 char 数组的情况下存储堆栈的过去值?看到代码了吗?