CLion中的C程序在调试模式下运行良好,但正常执行时返回退出代码-1073741819(0xC 0000005

gajydyqb  于 2022-12-11  发布在  其他
关注(0)|答案(1)|浏览(309)

我正在做代码的降临,我试图用C来完成这一切。我现在已经到了第三天,我差不多解决了这个问题,但是正如标题所说,它在我的IDE CLion. Here is the objective中表现得非常奇怪。我非常想知道为什么它不能正常运行,并且找出为什么似乎超出了我的能力范围。这是我的代码:

//
// Created by gusta on 2022-12-06.
//
#include "aocio.h"
#include <string.h>

int cexists(char* cp, char c, int length);
char getDuplicate(char* line);

int main() {

    FILE* fptr = openFile("../Inputs/day3.txt");

    char* line;
    while (readLine(fptr, &line)) {
        char c = getDuplicate(line);
        putchar(c);
    }

    return 0;
}

char getDuplicate(char* line) {  // Returnerar STRING_END om ingen fanns

    unsigned int length = strlen(line);

    char letters[length/2];
    char* cp = &letters[0];

    for (int i = 0; i < length/2; i++) {
        letters[i] = ' ';
    }

    for (int index = 0; line[index] != STRING_END; index++) {

        if (index < length/2) {

            int i_char = cexists(letters, line[index], length/2);
            if (i_char == -1) {
                *cp = line[index];
                cp++;
            }
        }
        else {
            if (cexists(letters, line[index], length/2) != -1) {
                return line[index];
            }
        }
    }

}

int cexists(char* cp, char c, int length) {

    for (int i = 0; i < length; i++) {
        if (cp[i] == c) {
            return i;
        }
    }
    return -1;
}

下面是aocoi.h(代码input output. h的出现):

//
// Created by gusta on 2022-12-01.
//

#ifndef ADVENTOFCODE_AOCIO_H
#define ADVENTOFCODE_AOCIO_H

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#define SIGN_ASCII 45
#define TRUE 1
#define FALSE 0

#endif //ADVENTOFCODE_AOCIO_H
#define STRING_END '\0'
#define NUMBERS_ASCII 48


char* prompt(const char* question) {
    printf(question);

    char* string = malloc(1);
    int curChar = 0, index = 0;
    while (curChar != '\n') {
        curChar = getchar();
        if (curChar == '\n'){
            string[index] = STRING_END;
        }
        else{
            if (index > 0) {
                string = (char*) realloc(string, index+1);
            }
            string[index] = curChar;
        }
        index++;
    }
    return string;

}

FILE* openFile(const char* fileName) {
    FILE *fptr;
    fptr = fopen(fileName, "r");
    if (fptr == NULL) {
        printf("Big fat file error!!\n");
        fclose(fptr);
        getchar();
        exit(-1);
    }

    return fptr;
}

char readLine(FILE* fptr, char** line) {
    int index = 0, end = 0;
    char* string = (char *) malloc(1);
    char curChar;

    do {
        end = fscanf(fptr, "%c", &curChar);

        if (end == EOF) {
            string[index] = STRING_END;
            fclose(fptr);
            *line = string;
            return FALSE;
        }

        if (curChar == '\n') {
            string[index] = STRING_END;
            *line = string;
            return TRUE;
        }
        else {
            if (index > 0) {
                string = (char *) realloc(string, index + 1);
            }
            string[index] = curChar;
            index++;
        }
    } while (end != EOF);
}

int parseToInt(char* string) {

    int numberLength = 0, number = 0;
    int sign = FALSE;

    for (int index = 0; string[index] != STRING_END; index++) {
        numberLength++;
    }

    for (int index = numberLength-1; index >= 0; index--) {

        char curChar = string[index];
        if (index == 0 && curChar - SIGN_ASCII == 0) {
            sign = TRUE;
            continue;
        }
        if (curChar - NUMBERS_ASCII >= 0 && curChar - NUMBERS_ASCII <= 9) {
            int num = (int) (curChar - NUMBERS_ASCII);
            num *= (int)(pow(10, numberLength-index-1));
            number += num;
        }
        else {
            printf("Felaktig inmatning. parseInt kan bara ta in tal"); // Invalid input. parseInt can only take in numbers
            getchar();
            exit(-1);
        }
    }
    if (sign == TRUE) {
        number *= -1;
    }
    return number;
}

通过搜索网页,我发现错误代码应该意味着堆栈溢出(哈!)或类似的东西,但我无法在我的代码中找到任何可能发生这种情况的地方。所有的指针和东西都应该自动释放-有什么我错过了吗?

xu3bshqb

xu3bshqb1#

readLine()中:

if (index > 0) {
    string = (char *) realloc(string, index + 1);
}
string[index] = curChar;

在这一部分之后,缓冲区的大小为index+1,因此string[index]是可以写入的最后一个元素。

index++;

现在,写入string[index]超出界限,导致缓冲区溢出。这是检测到EOF或EOL时发生的情况。

相关问题