linux下c语言字符串指针问题

sharemon 2018-01-20 11:40:52
最近在linux下写了一小段代码(如下),非常简单的复制字符串的程序,将src中的字符串复制到dest中。
但是dest的长度给小了,导致没有复制完全,但是出来的结果我有点没有办法理解。哪位大神帮忙看看,解释一下其中原理。多谢了~

代码:
#include <stdio.h>

int main(void)
{
int i, n;
char src[] = "welcome...";
char dest[3]; // size is too small

i=0;
while(src[i] != '\0'){
printf("before, i=%d\t", i); // debug
dest[i] = src[i];
printf("after, i=%d\n", i); // debug
i++;
}
dest[i] = '\0';

puts(dest);

return 0;
}

运行结果:
before, i=0 after, i=0
before, i=1 after, i=1
before, i=2 after, i=2
before, i=3 after, i=99

问题:
为什么最后一次dest[i] = src[i]执行过之后, i会突然变成99?
...全文
215 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2018-01-22
  • 打赏
  • 举报
回复
其实电脑开机后物理内存的每个字节中都有值且都是可读写的,从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页,一页通常为4KB。
赵4老师 2018-01-22
  • 打赏
  • 举报
回复
“多一少一”问题占程序员常犯错误的10%以上! 避免“多一少一”问题的方法之一是将比如<10甚至<5的数代入程序片断,掰手指头心算验证一下程序到底应该写为 x、x-1、x+1中的哪个? <、<=、==、>、>=中的哪个?
自信男孩 2018-01-20
  • 打赏
  • 举报
回复
首先越界访问本身就会出现未定义行为。就是出现的结果是随机的,当然你可以根据结果来推断可能的执行方向,但是这个不是一定出现的。比如在我的Linux环境下执行的结果是:
before, i=0	after, i=0
before, i=1	after, i=1
before, i=2	after, i=2
before, i=3	after, i=3
before, i=4	after, i=4
before, i=5	after, i=5
before, i=6	after, i=6
before, i=7	after, i=7
before, i=8	after, i=8
before, i=9	after, i=9
welcome...
因此不要做越界访问的操作
faihung 2018-01-20
  • 打赏
  • 举报
回复
引用 3楼faihung 的回复:
首先,c的ASCII码的值为99 其次,你前面定义变量区域,发现没有dest[3]之后,就是int i了。 其实这里就是一个栈区间,根据入栈的顺序,dest[3]之后就是变量i了。 所以&dest3就是&i。
因为dest数组越界,所以就会影响到i的值,i前一刻还是3,这里就会变成99了。
faihung 2018-01-20
  • 打赏
  • 举报
回复
首先,c的ASCII码的值为99 其次,你前面定义变量区域,发现没有dest[3]之后,就是int i了。 其实这里就是一个栈区间,根据入栈的顺序,dest[3]之后就是变量i了。 所以&dest3就是&i。
das白 2018-01-20
  • 打赏
  • 举报
回复
试着输出dest[3] 和 i的地址比较 应该相同
das白 2018-01-20
  • 打赏
  • 举报
回复
数组越界 将c赋给越界的位置 也就是i i=c = 99

70,023

社区成员

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

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