C 如何正确存储strtok
我有: 其中,var是声明为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。更改代码以在循环结束而不是开始时分配令牌,这也将阻止您跳过第一个令牌
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 faultingWhatNULL
?另外,这可能是你在填充指针数组后所做的事情。你为什么不使用我在另一篇文章的答案中发布的代码?这会节省你我和很多时间,现在你应该选择他的答案,这是正确的。这行:'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