C 如何正确存储strtok

C 如何正确存储strtok,c,arrays,pointers,malloc,realloc,C,Arrays,Pointers,Malloc,Realloc,我有: 其中,var是声明为char**var的结构中的变量 当我尝试这个,我得到一个seg故障,我不知道为什么。如果取出malloc和strcpy,它不会出现seg故障,但我需要将令牌存储在数组中。数组由myStruct数组声明 在使用strtok()获取下一个令牌之前,您正在检查令牌是否为NULL。对strtok的最后一次调用将是NULL,然后strlen(令牌)将本质上是strlen(NULL),并导致segfault。更改代码以在循环结束而不是开始时分配令牌,这也将阻止您跳过第一个令牌

我有:

其中,var是声明为
char**var的结构中的变量

当我尝试这个,我得到一个seg故障,我不知道为什么。如果取出malloc和strcpy,它不会出现seg故障,但我需要将令牌存储在数组中。数组由myStruct数组声明

在使用
strtok()
获取下一个令牌之前,您正在检查令牌是否为
NULL
。对strtok的最后一次调用将是
NULL
,然后
strlen(令牌)
将本质上是
strlen(NULL)
,并导致segfault。更改代码以在循环结束而不是开始时分配令牌,这也将阻止您跳过第一个令牌

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++;
}
这一行:

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," ");
}
无法检查调用strtok()的结果

建议:

token = strtok(NULL," ");

我告诉过你检查
malloc()
是否没有返回
NULL
,因为这会导致未定义的行为,忽略函数返回的可能错误代码或错误值是非常糟糕的做法,除此之外,你的代码应该正常工作。为什么您确定此代码段中发生了分段错误?而且,
x=realloc(x,newSize)
非常糟糕,因为如果
realloc()
返回
NULL
您将失去对
x
指向的有效指针的引用。我认为它发生在那里,因为如果我不包括realloc、malloc、strcpy,程序工作正常。我会添加错误检查,但我很确定它是空的,这就是为什么它的seg faultingWhat
NULL
?另外,这可能是你在填充指针数组后所做的事情。你为什么不使用我在另一篇文章的答案中发布的代码?这会节省你我和很多时间,现在你应该选择他的答案,这是正确的。这行:'array.var[counter]=malloc(strlen(token)+1);'当令牌为空时,将导致seg故障事件,因为strlen将尝试从地址0读取偏移量。如果执行超过了上面的一行(不太可能),那么这一行:'strcpy(array.var[counter],token);'将导致seg故障事件,因为strcpy正在尝试从偏移量off地址0读取。否,检查在正确的位置执行。而
strlen(NULL)
将导致未定义的行为,而不是分段错误。当找不到更多令牌时,strtok将返回NULL。他在while循环开始时分配令牌,然后继续在strlen和strcpy中使用它,而不检查它是否为null。我说过不会吗?除非OP在进入
while
循环之前没有调用
strtok()
,这是非常不可能的,否则在此代码中无法取消引用
NULL
指针。while语句的第一行将使令牌
NULL
。然后,他用token作为参数调用
strlen()
strcpy()
;在strcpy之前?strcpy也在复制它之前的令牌
if( NULL == (token = strtok(NULL, " ") ) )
{// then, strtok failed to find a ' ' delimeter
   break;  // exit while loop
}

// implied else, strtok successful