【问题标题】:Segmentation fault using relational operators in if condidtion在 if 条件下使用关系运算符进行分段错误
【发布时间】:2017-05-12 16:15:22
【问题描述】:

第一个 if 条件导致分段错误。我无法真正理解为什么,因为我在其他地方使用了与关系运算符类似的 if 子句。提前感谢您的帮助。

int foo(char *str1,char **str2, char **str3)
{
  char *token1;
  char *token2;
  char *token = strtok(str1, "\"");
  int spaces = strcmp(token,"  ");
  int parenthesis = strcmp("{",token);
  if((token == NULL) || ((spaces != 0) && (parenthesis != 0))) 
  {
    printf("ERR.\n");
    return 0;
  } 
  token = strtok(NULL, "\"");
  if(token == NULL)
  {  
    printf("2ERR\n");
    return 0;
  }
  token1= strtok(NULL, "\"");
  if(token1 == NULL || strcmp(token1," -> ") != 0)
  {
    printf("3ERR\n");
    return 0;
  }
  token2 = strtok(NULL, "\"");
  return 1;
  }

【问题讨论】:

  • 这段代码 sn-p 中声明的parente 在哪里?
  • name_aparente 定义在哪里? str1 传递什么如果是字符串字面量或其他 const 内存,strtok() 在尝试将\'0' 写入字符串时会出问题。
  • 你确定你甚至达到了你的if声明吗?你是在调试器中运行的吗?
  • @Gerhardh Str1 在动态内存中分配。
  • 为什么不提供您真正运行的代码?由于您显然为 SO 创建了一些不同的东西,因此您可能很容易错过重要的部分。顺便说一句:您使用令牌而不检查NULL

标签: c if-statement segmentation-fault operator-keyword relational


【解决方案1】:

如果您不使用char[]strtok 将会崩溃。您可以使用strcpy 绕过它。

char str[80];
strcpy(str, str1);
char *token = strtok(str, "\"");

我不确定您要做什么,但您的代码将在进行微小更改后运行而不会崩溃。

#include <stdio.h>
#include <string.h>
int foo(char *str1,char **str2, char **str3)
{
    char *token1;
    char *token2;

    char str[80];
    strcpy(str, str1);
    char *token = strtok(str, "\"");
    int spaces = strcmp(token,"  ");
    int parenthesis = strcmp("{",token);
    if((token == NULL) || ((spaces != 0) && (parenthesis != 0)))
    {
        printf("ERR.\n");
        return 0;
    }
    token = strtok(NULL, "\"");
    if(token == NULL)
    {
        printf("2ERR\n");
        return 0;
    }
    token1= strtok(NULL, "\"");
    if(token1 == NULL || strcmp(token1," -> ") != 0)
    {
        printf("3ERR\n");
        return 0;
    }
    token2 = strtok(NULL, "\"");
    return 1;
}
int main() {

    char * c1, * c2, * c3;
    c1 = "foobaz";
    c2 = "bar";
    c3 = "baz";

    int i =  foo(c1, &c2, &c3);
    return 0;
}

【讨论】:

  • “如果你不使用char[],函数strtok 将崩溃”通常具有误导性,不一定正确。函数strtok 接受一个指向非常量 以null 结尾的字符数组的指针。因此,例如,如果您声明 const char str[5],则在调用 strtok(str,...) 时会出现分段错误(或更一般地说,未定义的行为)。由于字符串字面量在定义上是常量,因此它也不能作为函数 strtok 的第一个输入参数传递。
  • 如果一个指针被传递给strtok,该指针指向动态分配的内存,那么我们可以假设我们对 const 内存没有问题。
猜你喜欢
  • 1970-01-01
  • 2014-12-11
  • 1970-01-01
  • 1970-01-01
  • 2020-07-14
  • 2022-08-02
  • 1970-01-01
  • 2015-05-23
  • 1970-01-01
相关资源
最近更新 更多