【问题标题】:Strcmp using two pointers is causing a segmentaion fault使用两个指针的 strcmp 导致分段错误
【发布时间】:2015-10-17 03:18:43
【问题描述】:

我正在尝试比较两个我基本上已经制成字符串的指针。我不知道如何解决这个问题,但是当我运行它时,它会在 strcmp 处给我一个 seg 错误。

这是我的代码:

int find_next_string(int *position, char str[], char * mem_start, int mem_size)
{
    int found = 0;
    char *temp2;
    int k = 0;
    int i=(*position+1);
    char *temp ;
    int temp3 = 0;

    temp = (char *) calloc(mem_size, sizeof(char));    
    temp2 = (char *) calloc(mem_size, sizeof(char));
    temp3=*position;
    while(i!=temp3 && found==0 && k==0){
        //for(j=0;i<mem_size;i++){
            temp2=mem_start;
            // j++;
            temp=strstr(temp2, str);
            if(strcmp(temp2, temp)==0){
                found=1;
                k=i;
            }
        //}
        if(i==mem_size)
        i=0;
        else
        i++;
    }
    if(found)
        print_line(k, mem_start, mem_size);
    //    1.  update the location to the first character matching str
    //    2.  print the 16-byte word containing the string and repeat
    //        printing words until all characters in str are displayed
    //    3.  set found to 1
    // if not found, do not change location and do not print
    free(temp);
    free(temp2);
    return found;
}

【问题讨论】:

  • 你如何调用/使用这个函数?你还记得字符串(strcmp 使用的)有一个特殊的终止符,这意味着字符串的实际长度实际上是stlen(str) + 1
  • * 输入: * str 是要查找的字符串 * mem_start 是数据的起始地址 * mem_size 是内存块中的字节数 * 输入/输出: * position 是光标的位置.如果找到字符串 * 位置将更新为与字符串匹配的第一个字节的内存偏移量 * 返回值:* 如果找到字符串,则为 true
  • 输入所有内容后,我应该在 mem_start 中找到另一个等于 str 的位置
  • read about how to ask good questions,并学习如何创建Minimal, Complete, and Verifiable Example。此外,在添加重要信息时,请编辑您的问题,而不是将其添加为 cmets。

标签: c pointers segmentation-fault strcmp


【解决方案1】:

崩溃很可能不是由于strcmp 调用,而是由于您重新分配 temp2 然后尝试free 新指针。您对temp 执行相同操作。

如果这些新指针没有分配给malloc(或calloc,本质上是malloc加上memset),那么您将有未定义的行为,这是一个非常常见的原因崩溃。而关于temp,它可以指向一些内存的中间,尝试在该指针上调用free(即使它指向分配有malloc的块的中间)也是UB。

free 函数必须传递一个由mallocNULL 返回的指针,仅此而已。

【讨论】:

  • 好吧,我知道它在 strcmp 期间,因为那是我 gdb 时崩溃的地方。我用完后释放内存。
  • @WilliamBrendanDagley 然后你需要弄清楚你真正传递给strcmp调用的是什么。当崩溃发生并且您在 GDB 中捕获它时,您是否尝试过实际查看指针及其指向的内容?
  • @WilliamBrendanDagley 另外,不,你没有free 你从calloc 得到的指针。当你这样做时temp = strstr(...)松开原来的指针。 复制字符串,或者根本不为这些指针分配动态内存。
  • (gdb) p temp $1 = 0x604820 “蓝岭打哈欠它的伟大,老虎队在那里打球,亲爱的老克莱姆森的儿子们在这里永远统​​治着至高无上。Je8SgUsYACuRzwOQ8vJP5YMKBnAY95Z1aQQjiuxUWQzSjONbiso 蓝岭打哈欠它的伟大”...
  • (gdb) p temp2 $2 = 0x604270 "克莱姆森老虎!\n\001\002\003\004\005\006\a\b\t\n\v\f\r\016 \017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037 !\"#$%&'()*+,-./ 0123456789:;?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}\177\200\201\202\203\204\205\206\207\210\211\212\213\214\215\ 216\217\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237\240\241\242\243\244\245\246\ 247\250\251\252\253\254\255\256\257\260\261\262\263\264\265\266\267\270\271"...
【解决方案2】:

这是一个基本错误:

temp=strstr(temp2, str);
if(strcmp(temp2, temp)==0){

如果strstr 没有找到字符串,那么temp 将为NULL。将 NULL 传递给 strcmp 会导致未定义的行为,这可能是导致崩溃的原因。

在调用strcmp之前,您需要检查if ( temp == NULL )并采取一些措施。

【讨论】:

    猜你喜欢
    • 2021-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-19
    • 2018-01-23
    • 2021-03-02
    • 2013-07-26
    相关资源
    最近更新 更多