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

时间:2014-03-13 17:23:46

标签: c pointers malloc

我在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分配的内存肯定不会做好事。”但我很确定我已经分配了所有内容

1 个答案:

答案 0 :(得分:0)

这是一个错误:

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

你malloc一个区域,然后立即失去该值,用pop()替换它。

这绝对是一个错误:

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

在检查n的范围之前分配给标签[n]。在使用sizeof(tag)之后检查n的范围时。 tag是一个指针。它的大小是4(32位)或8(64位)。这两个大小都与n写入无效内存之前tag[n]的大小有关。

另一个错误:

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

如果您是初级C程序员,从不施放指针。因为我怀疑你已经学到了足够的知识,但不知道这是好主意还是坏主意。

类型系统存在的原因很充分,如果它抱怨某些类型不匹配,那么它的可能性要大于你。