有关指针

joyself 2005-01-24 12:46:52
/* strtok example */
#include <stdio.h>
#include <string.h>

int main ()
{
char str[] ="This is a sample string,just testing.";
char * pch;
printf ("Splitting string \"%s\" in tokens:\n",str);
pch = strtok (str," ");
while (pch != NULL)
{
printf ("%s\n",pch);
pch = strtok (NULL, " ,.");
}
return 0;
}


将char str[]改为 char *str就会segmatation fault
哪位可以解释一下么?谢谢
...全文
149 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
lovefly_fanny 2005-01-24
  • 打赏
  • 举报
回复
而如果你以数组存放它之后,
这里其空间是开辟在堆栈上的
修改其内容当然也就没问题了···
这边有很多关于这个话题的,
你搜索一下就可以找到了 ^_^
lovefly_fanny 2005-01-24
  • 打赏
  • 举报
回复
那个是常量数据=··》"This is a sample string,just testing.";
你通过指针引用它,然后再赋值指针,
编译是通不过的
因为常量数据区的数据是不允许被修改 的
而你一旦用指针指向它了之后然后指针赋值就很有可能
改变其值,编译时刻视为fault
l12456789 2005-01-24
  • 打赏
  • 举报
回复
o 哦 我地明白了!谢谢!
lovefly_fanny 2005-01-24
  • 打赏
  • 举报
回复
o哦 还有这么多的说道呢!大家研究的很深哦 高人就是高人 学习中 菜鸟发问 那为什么栈中的就可以改呢??思考ing.........
每个进程都有一个自己的堆栈,区别于系统的核心态堆栈
实际上自己的一个堆栈就是为了用于保存一些临时数据的,如
局部变量,函数参数,这个堆栈在内存中就是一段连续的内存块,
在其中的变量是可以被随时修改的(在其生命周期之中),
退出某个函数的时候,这些变量被相应的pop出堆栈
c++在内存中分为5个区:堆、栈、自由存储区、全局/静态存储区和常量
存储区。
vinep 2005-01-24
  • 打赏
  • 举报
回复
strtok函数在第一次查找时,如果找到把串中标记前的子串置为NULL,
第二次查找仍然在那个串的首地址开始查找,所以以后的查找可以不指定源串。
它的位置以NULL代替
多次查找相同。
很明显它在改变源串的值。
char str[] = "" 内存申请在栈上
char *str = "" 内存申请在常量区
大家都说的很明白了,哈哈
dlqcsdn 2005-01-24
  • 打赏
  • 举报
回复
改为 const char *str = "This is a sample string,just testing.";
就ok 啦
l12456789 2005-01-24
  • 打赏
  • 举报
回复
char str[] ="This is a sample string,just testing.";
在栈上创建一个数组,放入字符串"This is a sample string,just testing."

char *str ="This is a sample string,just testing.";
在静态区分配内存放入字符串”This is a sample string,just testing“,作为常量,然后由指针str指向这块区域。
o哦 还有这么多的说道呢!大家研究的很深哦 高人就是高人 学习中 菜鸟发问 那为什么栈中的就可以改呢??思考ing..........
playmud 2005-01-24
  • 打赏
  • 举报
回复
哈哈,来晚了吧。
daylove 2005-01-24
  • 打赏
  • 举报
回复
55555555555
playmud 2005-01-24
  • 打赏
  • 举报
回复
char *str="This is a sample string,just testing.";
为什么不行?因为上面的操作是吧一个字符串常量的指针地址赋值给str,所以不行。
xuelong_zl 2005-01-24
  • 打赏
  • 举报
回复
在看标C时,注意看看它的库函数的标准声明,和对应的参数类型,这样会对你有帮助的
prgmBaggio 2005-01-24
  • 打赏
  • 举报
回复
mark
Henry0 2005-01-24
  • 打赏
  • 举报
回复
我说说这两种方式的区别吧

char str[] ="This is a sample string,just testing.";
在栈上创建一个数组,放入字符串"This is a sample string,just testing."

char *str ="This is a sample string,just testing.";
在静态区分配内存放入字符串”This is a sample string,just testing“,作为常量,然后由指针str指向这块区域。


至于为什么会出错,楼上的说的很清楚了
pengzhenwanli 2005-01-24
  • 打赏
  • 举报
回复
数据存放的地方不同。
楼上正解。
如果是指针处于数据常量区。不允许更改的。
elitenie 2005-01-24
  • 打赏
  • 举报
回复
那小弟有不懂的地方了,是个菜鸟,别笑话,那各是什么数据存在数据区,代码区,堆栈区?怎么划分的呢?谢谢!!!!!!!!!!!!!!!!!!!!!!!!

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧