malloc()上的分段错误

时间:2016-05-03 02:08:47

标签: c

我的代码中有问题,当我运行它时,我在malloc()函数中遇到了分段错误。这是我的代码,我是新来的,如果我写错了就很抱歉。

抱歉我的英文不好!

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>

typedef char String[50];
bool equalsIgnoreCase(char*,char*);

void main(){

 String nome;
 printf("Digite um nome: "); //name
 scanf("%s",nome);
  if(equalsIgnoreCase(nome,"TESTE")){ //test
     printf("Strings iguais."); 
  }else printf("Strings diferentes.");
}


bool equalsIgnoreCase(char *str1 , char *str2){
   char *a,*b;
   a = malloc(sizeof(char)); //segmentation fault here
   b = malloc(sizeof(char));
   for(;str1 != '\0';str1++,str2++){
     a = tolower(str1);
     b = tolower(str2);
     if(strcmp(a,b)!=0){
            free(a);
            free(b);
        return false;
    }
}
  free(a);
  free(b);
  return true;
}

3 个答案:

答案 0 :(得分:4)

在这种情况下,您不应该使用malloc()free()。它们导致内存泄漏。

另请注意,从tolower()返回的是字符,而不是指针。将它转换为指针几乎没有机会产生有效的指针。

将从tolower()传递到char的内容转换为unsigned char是好的,因为char可能已签名并且传递的范围不在unsigned char范围内{ {1}} EOF调用未定义的行为

另一点是tolower()不是判断str1 != '\0'是否指向字符串结尾的正确方法,而且还应检查str1

最后,您应该将str2用于不需要修改的字符串。

您的代码应该是这样的:

const char*

或使用bool equalsIgnoreCase(const char *str1 , const char *str2){ for(;*str1 != '\0' && *str2 != '\0';str1++,str2++){ if(tolower((unsigned char)*str1) != tolower((unsigned char)*str2)){ return false; } } return true; } a,如下所示:

b

也不要忘记

  • bool equalsIgnoreCase(const char *str1 , const char *str2){ int a, b; for(;*str1 != '\0' && *str2 != '\0';str1++,str2++){ a = tolower((unsigned char)*str1); b = tolower((unsigned char)*str2); if(a != b){ return false; } } return true; } 的原型声明更改为equalsIgnoreCase以匹配新功能。
  • 添加bool equalsIgnoreCase(const char*,const char*);以使用#include <ctype.h>
  • tolower()的返回类型更改为main()以符合标准。

答案 1 :(得分:0)

这段代码有很多错误。

首先让我说C已经有一个函数来比较忽略区分大小写的字符串,它叫stricmp(),并且非常像strcmp(),除非忽略大小写,你没有写自己的。

需要指出的另一个重要事项是abstr1str2都是指针

当你执行a = tolower(str1)时,你没有做任何有意义的事情,因为str1不是一个字符,它是一个指针,你也失去了对你刚分配的内存的引用,并试图堆栈中的free()内存无效。这样做的一种正确方法是*a = tolower(*str1)

此外,唯一符合1 char长度的字符串是空字符串。 C中的字符串以空值终止,这意味着您需要2 char来创建一个包含1个字符的字符串,因为它必须后跟\0才能成为有效的C字符串。

other answer所指出的那样,在malloc()使用此处也毫无意义。

答案 2 :(得分:0)

代码中有两个错误,可能会导致细分错误。

  1. for(;str1 != '\0';str1++,str2++){
  2. 比较str2和'\ 0',否则它将用完str2。

    1. if(strcmp(a,b)!=0){
    2. strcmp在这种情况下需要char *和两个字节,但a和b只有sizeof(char),只有一个字节。

      *a != *b

      的简单比较

      最后,我修复了分段错误,但 equalsIgnoreCase 仍然是逻辑错误,请自行完成。 `

      bool equalsIgnoreCase(char *str1 , char *str2){
         char *a,*b;
         a = (char*)malloc(sizeof(char)); //segmentation fault here
         b = (char*)malloc(sizeof(char));
         //for(;str1 != '\0';str1++,str2++){
         for(;*str1 != '\0' && *str2 != '\0';str1++,str2++){
           *a = (char)tolower((int)*str1);
           *b = (char)tolower((int)*str2);
           //if(strcmp(a,b)!=0){
           if (*a != *b) {
                  free(a);
                  free(b);
              return false;
          }
      }
        free(a);
        free(b);
        return true;
      }`