检查空指针时未定义的行为? (C)

时间:2014-01-02 00:56:54

标签: c pointers

我在这里以不同的方式打印一个数组:

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在指针真的为空时停止工作。怎么了?

1 个答案:

答案 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

看看这对你有用;然后找出你的代码实际上的不同......