数组和指针字符串声明之间的差异

时间:2014-12-11 09:41:32

标签: c pointers segmentation-fault strtok

我正在分割字符串。

当我运行此代码时,我收到错误(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声明时效果很好。

谁能告诉我为什么?我的大脑正在融化。

1 个答案:

答案 0 :(得分:2)

来自strtok()

man page
  

使用这些功能时要小心。如果您确实使用它们,请注意:

     
      
  • 这些函数修改了他们的第一个参数。

  •   
  • 这些函数不能用于常量字符串。

  •   

作为您的代码,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()的返回值。