| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 887 人关注过本帖
标题:初学者的一个问题,关于Segmentation fault错误
只看楼主 加入收藏
lcao
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2009-10-15
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:9 
初学者的一个问题,关于Segmentation fault错误
按道理,我应该可以修改字符串指针所指向的字符,代码如下:

#include <string.h>
#include <stdio.h>
#include <stdlib.h>

void strappend(register char *s, size_t len, char fill)
{
  register char *endpos;

  endpos = s+len;
  while (*s++);
  s--;
  while (s<endpos) *(s++) = fill;
  *(endpos) = '\0';
} /* strappend */



int  main()
{
  char  *s1 ="abbccdfdcdbbdcd";
  printf("s1=%s\n",s1);
  strappend(s1,10,'f');
  printf("s1=%s\n",s1);

 return 0;

}



我用gdb跟踪一下,出在*(endpos) = '\0'.
望大家解答一下,谢谢了。
搜索更多相关主题的帖子: fault Segmentation 
2009-11-13 21:02
lijm1989
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:珠海
等 级:贵宾
威 望:12
帖 子:675
专家分:2844
注 册:2009-10-14
收藏
得分:0 
愣是没看懂·····
  endpos = s+len;
  while (*s++);
  s--;
  while (s<endpos) *(s++) = fill;
  *(endpos) = '\0';

LZ能解释下么~~~~
2009-11-13 22:03
viky2003
Rank: 5Rank: 5
等 级:职业侠客
帖 子:375
专家分:383
注 册:2007-4-11
收藏
得分:0 
程序代码:
void strappend(register char *s, size_t len, char fill)
{
  register char *endpos;

  endpos = s+len;/* 这里也就是 &s[len] */
  while (*s++);
  s--;/*将s放在指向 \0 的地方 */
  while (s<endpos) *(s++) = fill;/* 如果按照逻辑来讲这个代码是有问题的,应该是 while(s > endpos) *s-- = fill 才对,因为endpos肯定比s小,因为s指向 \0 ,比如endpos大 ,那么endpos就可能指向一个非法越界的地址了,当然如果s数组够长是没有问题的*/
  *(endpos) = '\0';
} /* strappend */



int  main()
{
  char  *s1 ="abbccdfdcdbbdcd";/*首先这个是一个字符串常量,不能被修改,建议改为char s1[] =....*/
  printf("s1=%s\n",s1);
  strappend(s1,10,'f');
  printf("s1=%s\n",s1);

return 0;

}
反正写的比较。。。不好。

要练习算法就来http:///!!有挑战哦!!
2009-11-13 23:17
蓝色药剂
Rank: 4
等 级:业余侠客
帖 子:43
专家分:204
注 册:2007-11-24
收藏
得分:0 
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

void strappend(register char *s, size_t len, char fill)
{
  register char *endpos;

  // endpos = s+len;                   // 按照你程序的意图,应该在字符串结尾追加字符吧
  while (*s++);
  s--;
  endpos = s+len;                      // 所以上面的那句换到这里才行
  while (s<endpos) *(s++) = fill;
  *(endpos) = '\0';
} /* strappend */

int  main()
{
  char  *s1 ="abbccdfdcdbbdcd";  // 指针指向常量字符串,这个指针的内容不能进行修改
                                 // char s1[1024] ="abbccdfdcdbbdcd";  
  printf("s1=%s\n",s1);
  strappend(s1,10,'f');
  printf("s1=%s\n",s1);

return 0;

}
2009-11-14 14:41
lcao
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2009-10-15
收藏
得分:0 
以下是引用蓝色药剂在2009-11-14 14:41:10的发言:

#include <string.h>
#include <stdio.h>
#include <stdlib.h>

void strappend(register char *s, size_t len, char fill)
{
  register char *endpos;

  // endpos = s+len;                   // 按照你程序的 ...
char s1[1024] ="abbccdfdcdbbdcd";  对,改成字符数组就可以了。

程序的意思就是在字符串结尾添加字符
2009-11-14 19:58
lcao
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2009-10-15
收藏
得分:0 
以下是引用蓝色药剂在2009-11-14 14:41:10的发言:

#include <string.h>
#include <stdio.h>
#include <stdlib.h>

void strappend(register char *s, size_t len, char fill)
{
  register char *endpos;

  // endpos = s+len;                   // 按照你程序的 ...

// endpos = s+len;                   // 按照你程序的意图,应该在字符串结尾追加字符吧
  while (*s++);              
  s--;                       
  endpos = s+len                 不明白,s已经是末尾了,如果再加上len就指向strlen(s)+len的地方了,这个地方应该是非法了。





[ 本帖最后由 lcao 于 2009-11-14 21:58 编辑 ]
2009-11-14 20:05
jinmu
Rank: 2
等 级:论坛游民
帖 子:34
专家分:93
注 册:2009-11-9
收藏
得分:0 
6楼!!
endpos = s+len;是指针作为地址加上一个整数len,
其意义是指针当前指向位置的前方第len个数据的位置。
2009-11-14 22:06
jinmu
Rank: 2
等 级:论坛游民
帖 子:34
专家分:93
注 册:2009-11-9
收藏
得分:0 
  while (*s++);
  s--;
这个可不可以换个语句来实现,不容易看懂
2009-11-14 22:32
Kid_X
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:216
专家分:515
注 册:2007-10-8
收藏
得分:0 
char  *s1 ="abbccdfdcdbbdcd";和char s1[1024] ="abbccdfdcdbbdcd"; 两者是有本质区别的。前者和后者分配在不同的段中。如何没记错的话,前者的字符串是分配在只读段中,是无法修改的。此外,LZ添加字符串,可是没有给他分配空间,也会出错。
2009-11-15 20:41
蓝色药剂
Rank: 4
等 级:业余侠客
帖 子:43
专家分:204
注 册:2007-11-24
收藏
得分:20 
以下是引用lcao在2009-11-14 20:05:36的发言:


// endpos = s+len;                   // 按照你程序的意图,应该在字符串结尾追加字符吧
  while (*s++);              
  s--;                       
  endpos = s+len                 不明白,s已经是末尾了 ...
你程序要实现的功能是在字符串末尾追加,所以就是在原有基础上增加len个字符,当然要加到s的末尾了。

没有溢出是因为传入的字符串空间足够大,可以放1024个字符,而且也做假设len加上原来字符串长度,不会超过1024这个长度,否则这个程序铁定溢出。

如果你要处理在字符串后面追加字符这个功能,最好还是动态分配内存malloc,这样就不用假设字符串的处理长度了,只要内存足够,就可以处理任意长的字符串。当然如果用动态分配内存,还要记得free掉,不然就内存泄漏了。
2009-11-16 14:56
快速回复:初学者的一个问题,关于Segmentation fault错误
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018412 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved