C++几个小函数
之前看书,遇到几个编程题,要实现一些库自带的函数。于是动手写了写,并且做了一些测试。今晚在测试的时候,还发现了一些其他内存分配的问题,顺路一起记下。这里只写了字符串转整型,字符串赋值函数。
#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分别指向字符串常量,因此存放在另外一段相近的地址区域内。
版权声明:本文为博主原创文章,未经博主允许不得转载。
缓慢行走的蜗牛