下面的执行结果是什么?

#include<stdio.h>
#include<string.h>
void main()
{
char s[]="";
char d[]="";
strcpy(d,s);
printf("d=%s,\ns=%s",d,s);
}

执行结果:d=56789,

s=123456789

书上有关于这个的解答,说是因为当初分配的内存地址是连续内存的问题, 
原来的是1234\0123456789\0,strcpy后变成123456789\06789\0。

分析:首先要解释一下,char s[]="123456789"; char d[]="123"; 这样定义的数组和变量存放在栈内存中。 
          栈内存是一个自顶向下分布的数据结构,那么越先定义的变量地址就越高,越后定义的地址就越低。 
          s比d定义在前,那么s得到了高地址,而d得到了相对低的地址,那么内存中的存放形式就是 
                      d[] <- | -> s[] 
                 '1' '2' '3' '\0' | '1' '2' '3' '4' '5' '6' '7' '8' '9' '\0' 
          字符串拷贝后: 
                 '1' '2' '3' '4 ' | '5' '6' '7' '8' '9' '\0' '7' '8' '9' '\0' 
          中间的‘|’表示s[]的起始位置。 
          所以此时输出的是s的值是 '5' '6' '7' '8' '9' '\0'。

这个题目出的很好,一方面考查了栈的生长方向,另一方面考查了strcpy的具体细节。

如果

char d[]="12",

char d[]="1" 答案是什么呢?

执行结果依旧是:d=56789,

s=123456789

                 '1' '2' '\0' ' ' | '1' '2' '3' '4' '5' '6' '7' '8' '9' '\0' 
          字符串拷贝后: 
                 '1' '2' '3' '4 ' | '5' '6' '7' '8' '9' '\0' '7' '8' '9' '\0' 

这里就考虑对齐的问题,一般来说是4位一对齐。如果超过4位,就是8位一对齐。

char s[]="";
char d[]="";
printf("%p %p %p %p",d,d+,d+,d+); printf("\n%p \n",s); printf("%d\n",d[]);

运行输出:

0012FF38 0012FF39 0012FF3A 0012FF3B
0012FF3C
0 字符串结束符

Key看到d[3]是不存的。char d="12"占了4位。

如果

char d[]="1234",

char d[]="12345"

执行结果依旧是:d=9,

s=123456789

                 '1' '2' '3' ‘4’  \0 ' ' ' ' ' ' | '1' '2' '3' '4' '5' '6' '7' '8' '9' '\0'      
字符串拷贝后:

'1' '2' '3' '4 ' '5' '6' '7' '8' |  '9' '\0' '7' '8' '9' '\0'

输出:

123456789

9

看另一程序.

 

#include<stdio.h>
#include<string.h>
void main()
{
   char d[]="123";

char s[]="123456789";
strcpy(d,s);
printf("d=%s,\ns=%s",d,s);
}

虽然可以看到正确的输出结果d=123456789,s=123456789执,但是产生运行错误!!

这是因为字符串拷贝后,越过了目标字串的实际空间,访问到了不可预知的地址了。

参考:http://www.cnblogs.com/aquariusgx/archive/2011/02/16/1956320.html

转:一个strcpy的问题(很容易做错)的更多相关文章

  1. 自定义Jquery插件——由于项目需要,对页面中过长的文本进行截取,鼠标移上去有一个title的提示,所以做了一个Jquery过长文本处理的插件

    由于项目需要,对页面中过长的文本进行截取,鼠标移上去有一个title的提示,所以做了一个Jquery过长文本处理的插件下面是代码: // 掉用方式支持 $('select').textBeauty(1 ...

  2. 一个老牌程序员说:做Java开发,怎么可以不会这 20 种类库和 API

  3. 转一个distinct用法,很有帮助

    转一个distinct用法,很有帮助 (2011-12-01 15:18:11) 转载▼ 标签: 杂谈 分类: mysql复制 在使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提 ...

  4. 不到50行代码实现一个能对请求并发数做限制的通用RequestDecorator

    使用场景 在开发中,我们可能会遇到一些对异步请求数做并发量限制的场景,比如说微信小程序的request并发最多为5个,又或者我们需要做一些批量处理的工作,可是我们又不想同时对服务器发出太多请求(可能会 ...

  5. 【spring cloud】子模块module -->导入一个新的spring boot项目作为spring cloud的一个子模块微服务,怎么做/或者 每次导入一个新的spring boot项目,IDEA不识别子module,启动类无法启动/右下角没有蓝色图标

    如题:导入一个新的spring boot项目作为spring cloud的一个子模块微服务,怎么做 或者说每次导入一个新的spring boot项目,IDEA不识别,启动类无法启动,怎么解决 下面分别 ...

  6. Git库搭建好之后,当要提交一个新的文件,需要做的是3个步骤

    Git库搭建好之后,当要提交一个新的文件,需要做的是3个步骤 1.git add new.txt 2.git commit -m "add a new file" 3.git pu ...

  7. 大部分人都会做错的经典JS闭包面试题

    由工作中演变而来的面试题 这是一个我工作当中的遇到的一个问题,似乎很有趣,就当做了一道题去面试,发现几乎没人能全部答对并说出原因,遂拿出来聊一聊吧. 先看题目代码: function fun(n,o) ...

  8. Bug2020011601,在ssh项目的applicaitonContext.xml中,少了一个双引号,打包成功(没报错),项目运行才发现

    在ssh项目的applicaitonContext.xml中,少了一个双引号,打包成功(没报错),项目运行才发现. 加上少的双引号,解决了.

  9. 最近这两天看了关于H5游戏开发的一个教程,实践很短暂,看了很多理论的东西,现在呢也只是想回忆回忆关于EUI的部分知识吧

    首先我了解了什么是Egret: Egret中文就是白鹭的意思,Egret是一套H5游戏开发的软件.(纯粹属于个人理解) 其次我对以下几款软件的相关知识做了些了解: Egret Engine(引擎),E ...

随机推荐

  1. Unity3D使用mesh创建一个正方形

    using UnityEngine; using System.Collections; public class Quad : MonoBehaviour { // Use this for ini ...

  2. lightoj 1038 Race to 1 Again

    题意:给一个数,用这个数的因数除以这个数,直到为1时,求除的次数的期望. 设一个数的约数有M个,E[n] = (E[a[1]]+1)/M+(E[a[2]]+1)/M+...+(E[a[M]]+1)/M ...

  3. ShowDialog()弹出的窗体,关闭后,主窗体会闪烁的BUG

    如图,要实现下列等待界面时,等待界面是以ShowDialog弹出的,发现关闭后,主窗体会闪烁一下的BUG,搞半天没搞明白啥原因. 过了几天后,搜索了下发现,在fm.ShowDialog(),显示出来时 ...

  4. 关于jQuery中的$.grep()方法的使用

    数组筛选的方法,记录下,以加深印象. var ary = [1, 9, 3, 8, 6, 1, 5, 9, 4, 7, 3, 8, 6, 9, 1]; ary = $.grep(ary, functi ...

  5. 对于一些css样式的巧妙方法进行总结。

    针对之前遇到过的一些特殊样式的实现,我今天做个总结,目的有二:一是将这些方法记录下来,以便将来需要用到时查找使用.二为将这些大神们智慧的结晶发扬光大,让广大前端程序猿们能够少走弯路.此贴为更新帖,以后 ...

  6. php程序员的弱点

    今天在在知乎上看到一个问题,题目是<看了laravel的php框架怎么感觉很不靠谱?>,我最近也在想学习一下laravel,laravel听说是受到很大ruby on rails的影响. ...

  7. [LeetCode]题解(python):155-Min Stack

    题目来源: https://leetcode.com/problems/min-stack/ 题意分析: 实现一个小的栈,包括初始化,push,pop,top,和getMin. 题目思路: 私用是用两 ...

  8. OpenCV学习 6:平滑滤波器 cvSmooth()——2

    原创文章,欢迎转载,转载请注明出处 前面进行了彩色的模糊处理,我们对黑白图片进行同样的平滑处理,看看效果.首先是需要创建黑白图片,我对opencv的各种函数还不是很熟悉,我们可以先用熟悉的创建单通道的 ...

  9. 走进C标准库(4)——"stdio.h"中的putc

    花了点时间把园子弄得好看了点,现在继续. 函数名: putc 功  能: 输出一字符到指定流中 用  法: int putc(int ch, FILE *stream); #define _putc_ ...

  10. CSS自学笔记(4):CSS样式表的使用

    当浏览器读到一个样式表时,浏览器会根据这个样式表来格式化html文档,从而表现出各式各样的网页. 想要浏览器读到样式表,有三种方法: 1.外部样式表 外部样式表可以理解为.CSS文件.当多个页面使用同 ...