内存分配方法及字符(串)操作小结

OO~ posted @ 2014年2月27日 21:05 in C/C++ && 算法 , 2715 阅读

一. 内存分配方法

  内存分配方法在不同的语言下有不同的方法,但是原理都大同小异。下面主要就 C 和 C++ 中的内存分配方法做分析。

  C 中的内存分配方法主要有 malloc/free 和 memset 这两种。malloc/free 也是动态申请内存和释放内存,具体使用很简单:

int **a;
a = (int **) malloc(m * sizeof(int *));
free(a);

而 memset 函数是在 C 语言的头文件 string.h 中包含的。需要谨慎使用这个函数,因为其是以字节为单位进行赋值(在 int 等类型是使用该函数时需要注意)的,同时在内存的连续性问题上也有一定的相关性。函数原型如下,其中指针p为所操作的内存空间的首地址,c为每个字节所赋的值,n为所操作内存空间的字节长度,也就是内存被赋值为c的字节数。(memset 更多使用在 bool 类型的赋值中)

void * memset (void * p,int c,size_t n);

  C++ 中内存分配的方法主要是 new/delete。其中 new 调用构造函数完成动态分配和初始化工作,而 delete 会调用对象的析构函数,清理和释放掉内存。delete 有两种用法,对于内建简单数据类型,delete 和 delete [] 的功能是相同的。对于自定义的复杂数据类型,delete 和 delete [] 就不能互用,简单说来,前者是删除一个指针,后者是删除一个数组。注意 new 和 delete 不是函数,而是 C++ 的运算符。具体使用如:

int a[10];
a = new int[10];//new int(7), namely the initial value is 7;
delete a; // or delete []a;

二. 字符(串)操作

  算法中常常会有字符(串)等的操作。需要注意的是字符(串)和其他基本类型如 int 型等操作有很大不同,特别是四则运算上,‘0’ 和 0 也有区别。。。

  C 语言处理主要几个函数有 strcpy(), strcat(), strcmp(), strlen() 等,比较死板,但是速度却很快。

  python 在处理字符(串)时,个人觉得还是比较不错的,代码简洁,但是却会有大量时间的代价。(之前对同一字符(串)操作分别用 c 和 python 写了两段代码,运行的结果是后者时间是前者的 4 倍)

  C++ 中可以使用 C 的字符(串)操作方法,包含头文件是 cstring.h。而 C++ 本身有一个 string.h 的库,也算是一个类(感觉几乎所有的 C 的方法都可以看作是一个类)。标准C++中提供的string类得功能也非常强大的,有赋值、比较、交换等等。(目前位置用的较少,补充待续)

  在具体的问题中,我目前为止还有一个问题未得到解决:如何将一个字符 a 接到一个字符串 s 的尾部去。现有的 strcat() 等方法都是针对 char * & char * 操作的,我后来还试着尝试了先赋值给一个 char * 对象,然后再用 strcat() 等,但是还是会出现一些乱码等现象(python可能会比较好解决,直接可以取指定区间的子字符串)。

Avatar_small
依云 说:
2014年2月27日 21:53

先确保空间足够,然后
n = strlen(s);
s[n] = '\0';
s[n-1] = a;

Avatar_small
ddd 说:
2014年2月28日 08:50

@依云: 循环使用应该每次都要清 0 把?
PS:请教一下除了上述方法,没有更简单一点的么?

Avatar_small
依云 说:
2014年2月28日 13:28

@ddd: 循环使用的话,你可以完成之后再写结束符。或者你先把空闲空间全部置零,然后就可以直接往后边加字符了。

Avatar_small
OO~ 说:
2014年2月28日 17:59

@依云: 这个好像不行

Avatar_small
孙白菜 说:
2014年3月06日 09:35

你可以去看看realloc这个函数

Avatar_small
some one 说:
2014年3月19日 00:24

最后那个问题,如果都是string类就能直接使用c++ string 的加法来添加上去了,比如
string s="abcd"
cout<<s+"e"
就行

Avatar_small
OO~ 说:
2014年3月19日 08:51

@some one: 但是有一个不是string类就比较麻烦;特别是一个是 string s,另一个是 char a = 56 等等这类的东西;


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter