我正在尝试编写一个代码,用字符“:”拆分给定路径,并且有我的代码:
#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上运行它时,它工作得很好!!
答案 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()