gpt4 book ai didi

c - *** 检测到 glibc *** 无效指针 : 0x00000031bee21188

转载 作者:行者123 更新时间:2023-11-30 17:37:30 25 4
gpt4 key购买 nike

我在 stackoverflow 上查看了类似的问题,但我仍然不确定如何解决它。

#include <stdio.h> 
#include <stdlib.h>
#include <ctype.h>
extern char * pop();
extern void push(char *);
int i;
int j=0;
//Resize the array to 1.1 it's size
void reSize(char* tag){

char *temp = malloc(1.1*sizeof(tag));
for (i=0;i<(sizeof(tag)/sizeof(tag[0]));i++){
*(temp+i) = *(tag+i);
}
free(tag);
tag = temp;
}
int compare(char* tag, char* popVal){
i=0;
while (i<sizeof(tag)/sizeof(tag[0])){
if (*(tag+i) == *(popVal+i)){
i++;
}else{
return 0;
}
}
return 1;
}
void dothis(){
int ch;
int n=0;
char *tag = malloc(10* sizeof(char));
char *popVal;
while ((ch = getchar()) != '>'){
tag[n] = ch;
n++;
if (n > (sizeof(tag)/sizeof(tag[0]))-1 ){
reSize(tag);
}
}
if (*tag == '/'){
popVal = malloc(sizeof(tag));
popVal = pop();
j--;
if (!(compare(tag,popVal))){ // Compare will return 1 if the same
printf("Invalid");
exit(1);
}

}else{
push(tag);
j++;
}
free(tag);
free(popVal);
}

int main(int argc, char * argv[])
{
int ch;
while ((ch = getchar()) != EOF) {
if (!(isalpha(ch) || ch == '<'))
continue;
dothis();

}
if (j != 0){
printf("Invalid\n");
exit(1);
}

printf("Valid\n");
exit(0);
}

然后是外部方法:

#include <stdio.h>
#include <stdlib.h>
static int top = 0;
static char * stack[100];

int isEmpty()
{
return !(top);
}

char * pop()
{
if (isEmpty()){
fprintf(stderr, "Stack is empty");
exit(1);
}
top--;
return (char *) stack[top];
}

void push(char * thing2push)
{
if (top == 100){
fprintf(stderr, "Too many things in the stack");
exit(1);
}else{
stack[top] = thing2push;
top++;
}
}

在上一个问题中,选择的答案是“将指针传递给未使用 malloc 分配的内存肯定不会做好事。”,但我很确定我分配了所有内容

最佳答案

这里有一个错误:

popVal = malloc(sizeof(tag));       
popVal = pop();

您 malloc 一个区域,然后立即丢失该值,并将其替换为 pop() 中的内容。

这绝对是一个错误:

while ((ch = getchar()) != '>'){
tag[n] = ch;
n++;
if (n > (sizeof(tag)/sizeof(tag[0]))-1 ){

在检查 n 的范围之前分配给 tag[n]。当您在使用 sizeof(tag) 之后检查 n 的范围时。 tag 是一个指针。它的大小为 4(32 位)或 8(64 位)。这两个大小与 ntag[n] 写入无效内存之前可以有多大没有任何关系。

另一个错误:

char *  pop()
{
if (isEmpty()){
fprintf(stderr, "Stack is empty");
exit(1);
}
top--;
return (char *) stack[top];
}

如果您是一名初级 C 程序员,永远不要强制转换指针。因为我怀疑您是否已经学到了足够多的知识,无法知道这是一个好主意还是坏主意。

类型系统的存在有充分的理由,如果它提示某些类型不匹配,那么它比你更可能是正确的。

关于c - *** 检测到 glibc *** 无效指针 : 0x00000031bee21188,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22386247/

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