c - 为什么我的简单程序在 break 语句上崩溃?
问题描述
该程序恰好在 case '2' 的 break 语句上崩溃。没什么大不了的,它可以很好地执行该案例的代码,但是它在 break 语句上崩溃,这真的很奇怪,程序应该只是恢复循环。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<stdbool.h>
#define nullptr ((void*)0)
typedef unsigned char byte; //Tipo numérico de 8 bits
#define max 255
#define cap 256
typedef struct Elemento Elemento;
struct Elemento {
char* valor;
byte prioridade;
bool isvalid;
};
typedef struct {
short comprimento;
Elemento elementos[cap];
} Lista;
void inicializa (Lista* q) { //1
q->comprimento = 0;
}
void ordena (Lista *q) {
short i;
for (i = 1; i < q->comprimento; i ++) {
Elemento e = q->elementos[i];
short j;
for (j = i - 1;
j >= 0 && q->elementos[j].prioridade < e.prioridade;
j --) {
strcpy(q->elementos[j + 1].valor, q->elementos[j].valor);
q->elementos[j + 1].prioridade = q->elementos[j].prioridade;
}
q->elementos[j + 1] = e;
}
}
void enfileira (Lista* q, Elemento *s, byte p) { //2
if (q->comprimento != cap) {
q->elementos[q->comprimento].valor = (char *) malloc(strlen(s->valor)*sizeof(char));
strcpy(q->elementos[q->comprimento].valor, s->valor);
q->elementos[q->comprimento].prioridade = p;
q->elementos[q->comprimento].isvalid = true;
q->comprimento ++;
if (q->comprimento > 1) ordena(q);
}
}
Elemento primeiro (Lista* q) { //3
Elemento e;
if (q->comprimento != 0) {
e.isvalid = true;
strcpy(e.valor, q->elementos[0].valor);
return e;
}
e.isvalid = false;
return e;
}
Elemento remova (Lista* q) { //4
Elemento e;
if (q->comprimento != 0) {
e.isvalid = true;
strcpy(e.valor, q->elementos[0].valor);
byte i;
for (i = 0; i < q->comprimento - 1; i ++) {
strcpy(q->elementos[i].valor, q->elementos[i + 1].valor);
q->elementos[i].prioridade = q->elementos[i + 1].prioridade;
}
q->comprimento --;
return e;
}
e.isvalid = false;
return e;
}
short comprimento (Lista* q) { //5
return q->comprimento;
}
void reinicializa (Lista* q) { //6
q->comprimento = 0;
}
void finaliza (Lista* q) { //7
}
int main () {
Lista s;
Elemento e; e.valor = nullptr;
char *string = nullptr;
float valor;
byte prioridade;
short buffer_tam, string_tam;
byte input;
do {
printf("operacao: ");
string_tam = getline(&string, &buffer_tam, stdin);
switch (string[0]) {
case '1':
inicializa(&s);
break;
case '2':
string_tam = getline(&e.valor, &buffer_tam, stdin);
e.valor[string_tam - 1] = '\0';
scanf("%hhu", &prioridade);
enfileira(&s, &e, prioridade);
break;
case '3':
printf("%s\n", primeiro(&s).valor);
break;
case '4':
printf("%s\n", remova(&s).valor);
break;
case '5':
printf("%hi\n", comprimento(&s));
break;
case '6':
reinicializa(&s);
break;
case '7':
finaliza(&s);
break;
}
} while (string[0] != '0');
return 0;
}
也许它在其他地方无法重现,所以可能有一个常见的原因导致这种情况发生,但我在谷歌上没有找到关于这个主题的任何内容。
解决方案:当我用 'if' 语句替换 switch 时发生了同样的事情,只要它离开 if 环境就会崩溃。其原因是getline和scanf的混合,我用另一个getline替换了scanf以防万一'2'并且它没有崩溃。
解决方案
没有足够的空位
q->elementos[q->comprimento].valor = (char *) malloc(strlen(s->valor)*sizeof(char)); strcpy(q->elementos[q->comprimento].valor, s->valor);
'\0'
为字符串终止符再分配 1 个字节。
此外,返回值的malloc()
强制转换充其量是多余的,并且sizeof (char)
根据1
定义是:
q->elementos[q->comprimento].valor = malloc(strlen(s->valor) + 1);
strcpy(q->elementos[q->comprimento].valor, s->valor);
推荐阅读
- xcode - ld:找不到 -lDoubleConversion 的库 clang:错误:链接器命令失败,Xcode 中的退出代码为 1(使用 -v 查看调用)
- c# - MassTransit Saga:缺少一些事件来过渡阶段
- ios - 当我在 macbook 的 react native 项目中运行命令 npx run ios 时,它会给出错误提示 internal/modules/cjs/loader.js : 883
- javascript - Firebase 身份验证:更新(未登录用户)密码而不使用“sendPasswordResetEmail”
- animate.css - animate.css 使用 className 给出特定的延迟
- python - 关于 Python 中的逻辑与的混淆
- location - 单击时闪烁的位置点详细信息
- android - 持久的蓝牙连接 - 被活动的生命周期混淆
- java - 在 Adapter Android Studio 中选择联系人号码
- python - 将一个 numpy 数组添加到另一个数组的每个元素的开头或结尾