之前看书,遇到几个编程题,要实现一些库自带的函数。于是动手写了写,并且做了一些测试。今晚在测试的时候,还发现了一些其他内存分配的问题,顺路一起记下。这里只写了字符串转整型,字符串赋值函数。

#include <cctype>
/*C库函数,将字符串转换成整型*/
int my_atoi(const char* p);
/*C库函数,复制源字符串到目的字符串,返回新串*/
char *my_strcpy(char *dest, const char *src);
/*C库函数,返回子串*/
char *my_strstr(const char *s1, const char *s2);
源文件
#include <iostream>
#include <cassert>
#include "Deamo_functions.h"
using namespace std;
int my_atoi(const char* p)
{
assert(NULL != p);
bool neg_flag = false;
int res = 0;
if(p[0] == '+' || p[0] == '-')
neg_flag = (*p++ != '+');
while(isdigit(*p))
{
res = res * 10 + (*p++ - '0');
}
return neg_flag ? 0 - res : res;
} char *my_strcpy(char *dest, const char *src)
{
assert(dest!=NULL && src!=NULL);
char* addr = dest;
while((*dest++ = *src++)!='\0');
return addr;
} char *my_strstr(const char *s1, const char *s2)
{
int n;
if(*s2)
{
while(*s1)
{
for(n=0; *(s1+n) == *(s2+n); n++)
{
if(!*(s2+n+1))
return (char *)s1;
}
s1++;
}
return NULL;
}
else
return (char *)s1;
} int main()
{
int result;
result = my_atoi("3.2");
cout<<"3.2 with my_atoi: "<<result<<endl;
result = atoi("3.2");
cout<<"3.2 with atoi: "<<result<<endl;
cout<<"strcpy test........."<<endl;
char* src = "hello!";
//char* a = "a";
//char* b = new char[2];
//char c[] = "aaa";
char* dest = new char[10];
cout<<my_strcpy(dest,src)<<endl;
getchar();
}

本来测试my_strcpy函数是照下面那样写的。

cout<<"strcpytest........."<<endl;

char* src = "hello!";

char* dest = "123456789";

cout<<my_strcpy(dest,src)<<endl;

结果出现了下面的错误。发现src和dest的地址非常相近,如果src往后移动,就会指向dest了。这样的话产生地址访问出错了。想想内存分配的几条:

1)静态分配,加static的采用全局分配。

2)堆内分配,函数运行是编译器自动分配的。

3)栈内分配,有程序员动态使用malloc或new分配

那这个是属于哪一种呢。查了一下,貌似字符常量也单独扔到一块去。也就是说,dest和src现在指向了两个常量字符。所以,在my_strcpy函数中移动dest,src时,出现地址访问冲突了。所以,我们需要动态分配内存给dest。

为了验证,上面的代码还特意定义了两个不相关的变量a和b。打个断点,看看他们的地址是不是和上面一样。如下图

上图可以看出,dest和b是用new分配的,存放在相近的一段地址内。而src和a分别指向字符串常量,因此存放在另外一段相近的地址区域内。

版权声明:本文为博主原创文章,未经博主允许不得转载。

C++几个小函数的更多相关文章

  1. 使用getopt_long来解析参数的小函数模板

    getopt_long原型 #define no_argument 0 #define required_argument 1 #define optional_argument 2 struct o ...

  2. 几个非常有用的js小函数

    function $(v){ if(typeof v==="function"){ window.onload=v; }else if(typeof v==="strin ...

  3. JS_ECMA基本语法中的几种封装的小函数-2

    大家好!今天继续给大家写一下ECMA中的剩下的小函数以及实用的实例: 首先先给大家说一下字符串.数组.数学方法以及json的一点小知识点: 字符串方法: str.length str.charAt(i ...

  4. JS_ECMA基本语法中的几种封装的小函数-1

    今天给大家介绍js ECMA中几个封装的小函数以及一些常用的函数小案例: 1,找重复的函数 <script> //在数组里面找重复: function findInArr(n,arr){ ...

  5. JS_ECMA基本语法中的几种封装的小函数

      先来回顾一下我们的字符串: 字符串方法: str.length str.charAt(i):取字符串中的某一个; str.indexOf('e');找第一个出现的位置;找不到返回-1; str.l ...

  6. Python的numpy库下的几个小函数的用法

    numpy库是Python进行数据分析和矩阵运算的一个非常重要的库,可以说numpy让Python有了matlab的味道 本文主要介绍几个numpy库下的小函数. 1.mat函数 mat函数可以将目标 ...

  7. js小函数工具

    突然想到建一片文章关于自己所学到的一些小函数,今后需要的时候可以直接当工具使用. 1.获取当前时间小程序. function showTime(){ var show_day=new Array('星 ...

  8. canvas学习笔记、小函数整理

    http://bbs.csdn.net/topics/391493648 canvas实例分享 2016-3-16 http://bbs.csdn.net/topics/390582151 html5 ...

  9. Halcon小函数的封装和代码导出

    一.Halcon小函数的封装和修改 1.名词解释: 算子:指Halcon中最基础.最底层的函数(即你看不到它的代码实现),一个算子只有一句话,例如threshold算子. 小函数:由多个算子组合成的函 ...

  10. C# 延时小函数 很好用

    平时我们在做winform开发的时候,有时候需要让程序休眠几秒钟,但是,如果我们直接使用 thread.sleep()函数,页面ui就会停止响应.怎么样解决呢,你可以把页面涉及到表现ui的代码放到一个 ...

随机推荐

  1. HibernateReview Day1 - Introduction

    Hibernate已经学过去大概有半个月了,然后默默的忘掉了……所谓Practice makes perfect. 我尽力重新拾起来. 1.什么是ORM 在介绍Hibernate之前,我们先学习下OR ...

  2. Graphics.DrawString 方法

    MSDN上的解释: 在指定位置而且用指定的 Brush 和Font 对象绘制指定的文本字符串. public void DrawString( string s, Font font, Brush b ...

  3. Just like normal variables,

    Just like normal variables, pointers can be declared constant. There are two different ways that poi ...

  4. IM设计与实现的系统模块的聊天记录

    到非常多开发IM系统的朋友都想实现聊天记录存储和查询这一不可或缺的功能,这里我就把自己前段时间为傲瑞通(OrayTalk)开发聊天记录模块的经验分享出来,供须要的朋友參考下. 一.整体设计 1.存储位 ...

  5. HDU 1394 Minimum Inversion Number (数据结构-段树)

    Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java ...

  6. jdk和jre是什么?都有什么用?

    大家肯定在安装JDK的时候会有选择是否安装单独的jre,一般都会一起安装,我也建议大家这样做.由于这样更能帮助大家弄清楚它们的差别: Jre   是java   runtime   environme ...

  7. LinearLayout具体解释一:LinearLayout的简单介绍

    LinearLayout,中文意思是线性布局.假设你是初学android的,肯定会非常困惑"啥叫布局",啥又叫"线性布局"呢. 有的时候,我尝试用官方的语言去解 ...

  8. CodeForces 10C. Digital Root

    乞讨A.B.C ∈[1.N] && A*B != C,d(A*B) == d(C)组的数量. 首先要知道d(x) = (x%9 == 0 ? 9 : x%9); 那么则会有A*B == ...

  9. Light OJ Dynamic Programming

    免费做一样新 1004 - Monkey Banana Problem 号码塔 1005 - Rooks 排列 1013 - Love Calculator LCS变形 dp[i][j][k]对于第一 ...

  10. Android 内存泄漏优化汇总

    android内存泄漏优化摘要 博客分类: android android内存溢出OutOfMemoryError . android移动应用程序的内存分配一般是8凯瑟琳约,不正确地假定处理内存处理非 ...