gpt4 book ai didi

c - 正在重新分配的指针未分配,在 malloc_error_break 中设置断点进行调试

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

我一直在 Windows 上开发这个非常简单的 C 游戏,我使用命令 gcc matches.c -o ./matches 来编译它。我已将代码导入到我的 Mac 上,并使用 gccclang 重新编译它。使用这两种技术,程序会完全崩溃,有时会关闭我的终端 session 并输出它。

matches(54122,0x1137715c0) malloc: *** error for object 0x7ffee9e8ba40: pointer being realloc'd was not allocated
matches(54122,0x1137715c0) malloc: *** set a breakpoint in malloc_error_break to debug
Abort trap: 6

Broadcast Message from _appleevents@(myname).local
(no tty) at 20:33 CET...

matches(54122,0x1137715c0) malloc: *** error for object 0x7ffee9e8ba40: pointer
being realloc'd was not allocated

代码在 Windows 上完全没有错误。

我认为它与 xcode 或类似的东西有关。有谁知道如何解决这个问题?

顺便说一句,这是代码。 getline()

时程序在设置函数中崩溃
#include <stdio.h>
#include <stdlib.h>

void show_matches(int n);
void setup(int *numberOfPlayersA, int *gamemodeA, int *numberOfMatchesA);
void changePlayersTurn(int *currentPlayerA, int numberOfPlayers);
int random_move();

int main(void) {
char *input;
int currentPlayer = 1;
size_t n = 0;
int numberOfPlayers = 0;
int gamemode = 0;
int numberOfMatches = 0;
int move = 0;

setup(&numberOfPlayers, &gamemode, &numberOfMatches);
show_matches(numberOfMatches);

while (numberOfMatches >= 1) {
printf("\033[1;31m");
printf("\n\nPlayer %d> ", currentPlayer);
printf("\033[0m");

if (gamemode == 2 || currentPlayer == 1) {
getline(&input, &n, stdin);
move = atoi(input);

if (move > 3 || move < 1 ) {
move = 1;
}
} else {
int randomMove = random_move();
move = randomMove;
printf("%d", randomMove);
}



numberOfMatches -= move;
show_matches(numberOfMatches);


if (numberOfMatches >= 1) {
changePlayersTurn(&currentPlayer, numberOfPlayers);
}
}


printf("\n\nPlayer %d lost\n\n", currentPlayer);

return 0;
}

void setup(int *numberOfPlayersA, int *gamemodeA, int *numberOfMatchesA) {
char *input;
size_t n = 0;

printf("--The matches--\n\n");
printf("Do you plan on playing against:\n\t1. The computer\n\t2. Other persons\n\n(1 / 2) > ");
getline(&input, &n, stdin);
printf("1");
*gamemodeA = atoi(input);
printf("2");
if (*gamemodeA == 2) {
printf("\n\nPlease enter the number of players: ");
getline(&input, &n, stdin);
*numberOfPlayersA = atoi(input);
}
printf("Enter the number of matches: ");
getline(&input, &n, stdin);
*numberOfMatchesA = atoi(input);
*numberOfPlayersA = 2;
printf("4");
}

void changePlayersTurn(int *currentPlayerA, int numberOfPlayers) {
if (*currentPlayerA == numberOfPlayers) {
*currentPlayerA = 1;
} else {
*currentPlayerA += 1;
}
}

void show_matches(int n) {
for (int i = 0; i < n; i++) {
printf("|");
}
}

int random_move() {
int num = (rand() % (3 - 1 + 1)) + 1;
return num;
}

最佳答案

main 中:

 char *input;
...
getline(&input, &n, stdin);

你在没有初始化输入的情况下调用getline,如果(未定义的)值不是NULL,getline将释放它,因为它不是你有错误的分配 block 的地址

例如你需要:

  input = NULL;
getline(&input, &n, stdin);
move = atoi(input);

if (move > 3 || move < 1 ) {
move = 1;
}
free(input);

您在设置中有类似的错误:

char *input;
...
getline(&input, &n, stdin);
...
getline(&input, &n, stdin);

您需要在第一次调用 getline 之前将 input 设置为 NULL,并且在最后一次调用之后需要一个 free,例如:

char *input;
...
input = NULL;
getline(&input, &n, stdin);
...
getline(&input, &n, stdin);
*numberOfMatchesA = atoi(input);
free(input);

补充说明:

  • 你错过了检查 getline 的结果
  • 使用atoi 是不安全的,如果用户输入错误,你会得到 0,最好使用 strtodsscanf
  • main 中,当输入值不在 1 和 3 之间时,而不是强制 1,重做输入似乎更好

关于c - 正在重新分配的指针未分配,在 malloc_error_break 中设置断点进行调试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55129558/

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