我在这里以不同的方式打印一个数组:
char *myString=NULL;
char *Word;
myString= malloc (sizeof (mySchool) +1 ); /* mySchool is a string, which includes ';'*/
strcpy(myString, mySchool);
Word = strtok (myString, ";");
while (1){
if (Word==NULL)
break;
else {
/* prints */
}
Word = strtok(NULL, ";");
}
free (myString);
我没有写过打印过程,因为我不想打扰你。
问题是,我认为if (Word==NULL)
我运行它大约20次检查,程序有时工作得很好但有时Windows在指针真的为空时停止工作。怎么了?
答案 0 :(得分:1)
由于您在声明中使用Word
Word = strtok(myString, ";");
你不应该首先malloc
它(因为你将无法在以后释放它,因为指针的值将被更改 - 导致内存泄漏,并且当你尝试{{{时,会出现段错误1}}稍后(你不会显示,但如果使用free(Word)
则应该有。)malloc
返回一个指向原始字符串的指针(在此过程中会受到损坏;它实际上会用strtok
)覆盖令牌。
你如何分配'\0'
?它应该不完成
myString
因为使用带有const char* myString="hello;world";
的{{1}}会遇到麻烦(编译器很可能将字符串放入"只读"内存)。
这并不能解释你遇到问题的原因;它可能与您定义strtok
的方式有关。
更新3 (感谢@JimBalter提供的有用评论,以下合并)
您的更新代码更详细地解释了您的问题。你的行
const
非常麻烦。根据您定义myString
的方式,它可以为您提供不同的答案。例如,如果你做了
myString= malloc (sizeof (mySchool));
你会找到
mySchool
可能是4,8,......或者系统上指针的大小。
如果你写了
char *mySchool;
mySchool = malloc(30);
然后
sizeof(mySchool) == sizeof( char*)
(字符串中的字符数加上终止char mySchool[] = "this;is;trouble";
)。
因此,你的sizeof(mySchool) == 16
可能会在字符串的末尾运行(因为没有终止'\0'
) - 而不是返回NULL,下一次调用将返回一个指针你不拥有的空间。
简单修复:
strtok
和DON' malloc(或免费)nul
。你只需要将它声明为一个指针 - 它指向myString = malloc(strlen(mySchool) + 1);
中的空格,而不是它自己的空间。
以下程序包含了我所描述的内容;它适用于我:
Word
这正如预期的那样产生:
myString
看看这对你有用;然后找出你的代码实际上的不同......