【问题标题】:How to properly store strtok如何正确存储strtok
【发布时间】:2015-02-21 02:12:41
【问题描述】:

我有:

while (token != NULL)
{
    token = strtok(NULL," ");
    array.var = realloc(array.var,(counter + 1) * sizeof(char *)); 
    array.var[counter] = malloc(strlen(token)+1);         
    strcpy(array.var[counter],token);
    counter++;
}

其中 var 是声明为 char **var; 的结构中的变量 当我尝试这个时,我得到一个段错误,我不知道为什么。如果取出 malloc 和 strcpy,它不会出现段错误,但我需要将令牌存储在数组中。数组由 myStruct 数组声明;

【问题讨论】:

  • 我告诉你检查malloc() 没有返回NULL,因为这会导致未定义的行为,并且忽略函数返回的可能的错误代码或错误值是非常糟糕的做法,除此之外,您的代码应该可以工作。为什么你确定在这个 sn-p 中发生了 SEGMENTATION FAULT?而且,x = realloc(x, newSize); 非常糟糕,因为如果realloc() 返回NULL,你就会失去对x 指向的有效指针的引用。
  • 我认为它发生在那里是因为如果我不包含 realloc、malloc、strcpy,程序可以正常工作。我会添加错误检查,但我很确定它是 NULL,这就是它的段错误的原因
  • 什么是NULL?此外,这可能是您在填充指针数组后所做的事情。
  • 您为什么不使用我在您其他帖子的答案中发布的代码?那会为你我和Jammerx2 节省很多时间,现在你应该选择他的答案,它是正确的。
  • 这一行:'array.var[counter] = malloc(strlen(token)+1);'当 token 为 NULL 时将导致 seg 错误事件,因为 strlen 将尝试从地址 0 读取偏移量。如果执行超过上述行(不太可能),则此行:'strcpy(array.var[counter],令牌);'将导致段错误事件,因为 strcpy 正在尝试从地址 0 的偏移量读取

标签: c arrays pointers malloc realloc


【解决方案1】:

在获得带有strtok() 的下一个令牌之前,您正在检查令牌是否为NULL。最后一次调用 strtok 将是 NULL,然后 strlen(token) 本质上将是 strlen(NULL) 并导致段错误。更改代码以在循环末尾而不是开头分配令牌,这也会阻止您跳过第一个令牌。

while (token != NULL)
{
    array.var = realloc(array.var,(counter + 1) * sizeof(char *)); 
    array.var[counter] = malloc(strlen(token)+1);         
    strcpy(array.var[counter],token);
    counter++;
    token = strtok(NULL," ");
}

【讨论】:

  • 不,检查是在正确的地方进行的。而strlen(NULL) 将导致未定义的行为,而不是 SEGMENTATION FAULT。
  • strtok 将在找不到更多标记时返回 NULL。他在 while 循环的开头分配令牌,然后继续在 strlen 和 strcpy 中使用它,而不检查它是否为空。
  • 我说过不会吗?除非 OP 在进入 while 循环之前没有调用 strtok()(这种可能性很小),否则无法在此代码中取消引用 NULL 指针。
  • while 语句的第一行将生成令牌NULL。之后,他使用令牌作为参数调用strlen()strcpy()
  • 有没有办法把token=strtok(NULL," ");在strcpy之前? strcpy 也在复制它之前的令牌
【解决方案2】:

这一行:

token = strtok(NULL," ");

未能检查对 strtok() 的调用结果

建议:

if( NULL == (token = strtok(NULL, " ") ) )
{// then, strtok failed to find a ' ' delimeter
   break;  // exit while loop
}

// implied else, strtok successful

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-24
    • 2021-07-25
    • 2011-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多