我正在分割字符串。
当我运行此代码时,我收到错误(Mac上的Bus error: 10
或Linux上的SegFault。)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main ()
{
char *str = (char *)malloc(1000*sizeof(char));
str ="- This, a sample string.";
char * pch;
printf ("Splitting string \"%s\" into tokens:\n",str);
pch = strtok (str," ,.-");
while (pch != NULL)
{
printf ("%s\n",pch);
pch = strtok (NULL, " ,.-");
}
return 0;
}
当我通过char str[] ="- This, a sample string.";
更改str声明时效果很好。
谁能告诉我为什么?我的大脑正在融化。
答案 0 :(得分:2)
来自strtok()
使用这些功能时要小心。如果您确实使用它们,请注意:
这些函数修改了他们的第一个参数。
这些函数不能用于常量字符串。
作为您的代码,str
保存静态分配的字符串文字的基址,该文字通常是只读。
在您的代码中,更改
char *str = (char *)malloc(1000*sizeof(char));
str ="- This, a sample string.";
到
char *str = malloc(1000);
strcpy(str, "- This, a sample string.");
此外,首先使用str
将内存分配给malloc()
,然后将字符串文字分配给str
,将覆盖之前的内容由malloc()
返回的已分配内存,导致内存泄漏。
接下来,
char str[] ="- This, a sample string.";
这很有效,因为在这里你初始化一个本地array
,它的内容是可修改的。
注意:
请do not cast malloc()
的返回值。