我越来越重要,因为我无法解释我将要描述的情况。我需要你的关注!运行C程序后未定义的计算机行为
昨天我写了一个程序C.程序需要输入一个字符串,如果该字符串就是以这种形式“PKPKKKPPPKKKP”,即由只有“P”和“K”字符它打印你YES或NO 。是,如果一个'P'字符与'K'字符匹配。正如我们对括号字符问题'(',')'所做的那样,只能用'('我不得不用'P'而不用')','K'来代替。
从这里得到一点帮助,我设法完成了程序,它运行正常。我不认为复制代码会帮助任何人,但我会解释它是如何工作的。
程序说明: 该方案需要一个字符串(的字符串可以是高达500长度)作为输入,如果字符串仅包括“P”和“K”字符它打印YES或NO,如我上面描述过,否则它拒绝它。然后它逐个字符地读取输入,并且当它发现'P'时它被推入堆栈,否则弹出。 (我用链表实现了堆栈,所以用户可以给他想要的一个字符串(或者我认为是这样)。 在用户键入一个字符串之前,符号'A'在堆栈中。所以输入是由程序分析,逐个字符地进行分析,如果它找到'P'则将它推入堆栈,否则弹出堆栈。如果最后堆栈的顶部是'A'字符,则程序打印YES,否则NO。
问题描述: 所以我今天和我的一个朋友一起执行这个程序。一切都很好。直到我输入一个非常大的字符串,比如300'P和300'K(并且记住我的字符串是一个char字符串[500])。它打印是的。然后我输入一个800'P's + 800'K的字符串。它没有正确运行。 这是问题,事件发生后,无论我输入一个字符串,一个正常的“PKPKPK”,它会打印出数百万个奇怪的符号(x└X╨x└X╨x)。我没有触及代码,我发誓!我再次编译,再次运行,一样!它就像我的电脑(Windows 10)有问题。 而这个问题仍然存在于另一个程序中......我试图做一个简单的程序来运行一个用链表实现的堆栈。我推动了字符'a'并打印出来。它打印'á'。我推了'b'。它打印'h'。我推了'd'。它打印'L'。
显然我不应该输入这样一个巨大的字符串,因为它的长度限制是500.但问题仍然存在!我无法再写一个链接表的程序了。我很绝望!
代码:
#include "stdio.h"
#define FIRST_SYMBOL_IN_STACK 'A'
#define TRUE 1
#define FALSE 0
#define STR_LENGTH 50
#define YES "YES"
#define NO "NO"
#define PLA 'P'
#define KAL 'K'
typedef struct node {
char simvolo_eisodou;
struct node *next;
} node;
node *top = NULL; // the top of the stack
void push(char simvolo_eisodou); //stack function
int isStackEmpty(); //stack function
void pop(); //stack function
void printStack(); //print the current stack elements
int isInputValid(char *string);
void printWelcome();
int main() {
char input_string[STR_LENGTH], apantisi = 'G'; //O xristis mporei na dwsei input_string mikous ews 500 xaraktires
push(FIRST_SYMBOL_IN_STACK);
int i = 0;
scanf("%s", input_string);
if (isInputValid(input_string)) {
while (input_string[i] != '\0') {
if (input_string[i] == PLA) {
push(PLA);
printStack();
} else {
pop();
printStack();;
}
i++;
}
} else {
printf("Den anagnwristike to %s, input_string=(P|K)*\n");
_exit(-1);
}
if (top->simvolo_eisodou == FIRST_SYMBOL_IN_STACK) {
printf("%s\n", YES);
} else {
printf("%s\n", NO);
}
return 0;
}
void push(char simvolo_eisodou) {
node *newNode = (node*)malloc(sizeof(node));
newNode->simvolo_eisodou = simvolo_eisodou;
newNode->next = top;
top = newNode;
free(newNode);
}
int isStackEmpty() { //Thewrw oti i stoiva einai adeia otan i korifi einai to arhiko simvolo
if (top->simvolo_eisodou == FIRST_SYMBOL_IN_STACK) {
return TRUE;
}
return FALSE;
}
void pop(){
if (isStackEmpty()) {
printf("KENO\n");
printf("%s\n", NO);
_exit(-1);
}
node *temp = top;
top = top->next;
free(temp);
}
void printStack() {
node *current = top;
while (current != NULL) {
printf("%c ", current->simvolo_eisodou);
current = current->next;
}
free(current);
printf("\n");
}
int isInputValid(char *string) {
int i = 0;
while (*(string + i) != '\0') {
if (!(*(string + i) == 'P' || *(string + i) == 'K')) {
return 0;
}
++i;
}
return 1;
}
void printWelcome() {
printf("\n====================================================================\n");
printf("Welcome\n");
printf("====================================================================\n");
printf("\n\n\n Plz type input_string=(P|K)*\n");
}
“我不认为复制代码会帮助任何人”。这是一个非常错误的想法。问题几乎可以肯定是代码中的错误导致了未定义的行为。请在问题本身发布代码(而不是作为外部链接)。在代码运行后,你认为'top'指向的内存会发生什么:'top = newNode;免费(newNode);'?然后,当你试图访问'top'指向的数据时,你会怎么想呢? – kaylum
嗯我不知道会发生什么,如果你试图把更多的项目数组比数组有项目,嗯我不知道为什么会给你的问题... –
@kaylum top = newNode;意味着顶点指向newNode,所以我不再需要newNode,因此我可以释放它!正确? – Skemelio