c linux中的分段错误,但不是在windows中

时间:2015-10-21 11:00:23

标签: c linux

我正在尝试编写一个代码,用字符“:”拆分给定路径,并且有我的代码:

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

void parser()
{
    char ** res  = NULL;
    char *  p    = strtok (getenv("PATH"), ":");
    int n_spaces = 0, i;

    /* split string and append tokens to 'res' */

     while (p)
     {
         res = realloc (res, sizeof (char*) * ++n_spaces);

         if (res == NULL)
             exit (-1); /* memory allocation failed */

         res[n_spaces-1] = p;

         p = strtok (NULL, ":");
     }

     /* realloc one extra element for the last NULL */

      res = realloc (res, sizeof (char*) * (n_spaces+1));
      res[n_spaces] = 0;

    /* print the result */

      for (i = 0; i < (n_spaces+1); ++i)
          printf ("res[%d] = %s\n", i, res[i]);

    /* free the memory allocated */

     free (res);
}

int main(int argc , char* argv[])
{
    parser();
    return 0;
}

这段代码给了我linux中的分段错误但是当试图在windows上运行它时,它工作得很好!!

1 个答案:

答案 0 :(得分:4)

您缺少一个包含,即#include <string.h>,它负责为您正在使用的strtok函数提供原型。缺少原型是未定义的行为,不应该让你感到惊讶。

此外(感谢@milevyo指出这一点):

您不应该修改getenv()返回的指针。

C Standard, Sec. 7.20.4.5, The getenv function

  

使用getenv()

     

返回值可能是针对

a read-only section of memory
a single buffer whose contents are modified on each call
    getenv() returns the same value on each call
a dynamically-allocated buffer that might be reallocated on the next call
a tightly packed set of character strings with no room for expansion
     

在再次调用getenv()之前使用返回的字符串。不要修改   返回的字符串。

因此,通过向strtok调用指定已从getenv()返回的指针的变量,您将调用其他未定义的行为。

要更正此问题,请将getenv()返回的指针指向的字符串复制到strdup()

的辅助变量中