| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2112 人关注过本帖
标题:[不完美解决]果然被飞燕言中了,后遗症,关于字符串连接。谢谢大家
只看楼主 加入收藏
雨中飛燕
Rank: 1
等 级:新手上路
帖 子:765
专家分:0
注 册:2007-10-13
收藏
得分:0 
[bo]以下是引用 [un]zp_0409[/un] 在 2008-4-17 21:40 的发言:[/bo]

14楼的正确,a[]的长度无所谓,后面用的是c

错误,请先运行测试一下结果

" border="0" />
2008-04-17 21:45
moonwalker
Rank: 1
等 级:新手上路
威 望:1
帖 子:909
专家分:2
注 册:2007-3-2
收藏
得分:0 
[bo]以下是引用 [un]zp_0409[/un] 在 2008-4-17 21:40 的发言:[/bo]

14楼的正确,a[]的长度无所谓,后面用的是c

这句话有问题,数组a的地址作为参数传给了函数,它的长度就是要考虑的,你往后多写一个字符,就会越界。

“视频教程网”免费提供教学资源
C不限制你的自由!
条件是自己承担滥用自由的恶果!
2008-04-17 23:15
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
内存本身是无所谓读或者写的。但是,为了安全,系统在内存中加入的属性,要么读,要么写,要么读写。
char a[]="asdf",b[]="qwer";
是可以的,但是,这样会破坏掉栈空间,危险
char a[100]="asdf";//开一个大的空间
这样才是正确的方式。

注意。指针是和其指向的地方无关的。

顺便说一下。编译的时候,是将所有的字符串[bo]常量[/bo]放到一个地方,然后用一个指针指向它的。就算是让你写,你写掉了"asdf",但是超过了长度,也破坏了其他的字符串的……

[[it] 本帖最后由 StarWing83 于 2008-4-17 23:38 编辑 [/it]]

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-04-17 23:34
jamesbind
Rank: 1
等 级:新手上路
帖 子:45
专家分:0
注 册:2008-3-21
收藏
得分:0 
glibc早期版本的一个实现方法,这里也没有考虑dest之后的内存空间会被破坏的情况,个人觉得这是C语言本身的问题,只能由程序员注意内存空间的使用情况,没有什么好的解决办法:

char *
strcat (dest, src)
     char *dest;
     const char *src;
{
  char *s1 = dest;
  const char *s2 = src;
  reg_char c;

  /* Find the end of the string.  */
  do
    c = *s1++;
  while (c != '\0');

  /* Make S1 point before the next character, so we can increment
     it while memory is read (wins on pipelined cpus).  */
  s1 -= 2;

  do
    {
      c = *s2++;
      *++s1 = c;
    }
  while (c != '\0');

  return dest;
}
2008-04-18 00:25
快速回复:[不完美解决]果然被飞燕言中了,后遗症,关于字符串连接。谢谢大家
数据加载中...
 
   



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

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