一直觉得内存管理是个大头,c语言里面最大两个问题,内存管理和指针,到了c++,内容就比较精彩了,也无外乎四个东西,内存管理,指针,设计模式,泛型。下面就第一个说说值得注意的东西吧
(1)c语言中四个存储的区域,本blog的上一篇文章即是转载他人的相关文章,比较了堆和栈的区别,并加入了少量本人的注释
(2)内存泄露(free,delete)、内存区域未初始化(随机,非为0)、内存越界(申请内存未成功、野指针和数组越界)的问题 (3)数组和指针的对比
其实高质量c/c++编程里面有详细的讲述,也可以见如右的网页:c++内存管理
下面是我的相关注释
char *p="hello";
p[0]='X';
printf("%s",p);
//strcmp就相当于把二者指针的内容相减
原型:extern int strcmp(const char *s1,const char * s2);
所在头文件:string.h
功能:比较字符串s1和s2。
一般形式:strcmp(字符串1,字符串2)
说明:
当s1<s2时,返回值= -1
当s1==s2时,返回值= 0
当s1>s2时,返回值 = 1
ps:sizeof(1)数组和指针
参考网址:sizeof()用法汇总
sizeof(p)其中p是指针,所有指针变量的sizeof 操作结果均为4
sizeof(a)其中a是数组名,这就要分两种情况:a是作为函数参数,退化为指针,为4,但是如果是一般情况,那就是整个数组占多大就是多大
比较经典的辨析题
double* (*a)[3][6];
cout<<sizeof(a)<<endl; // 4 a为指针
cout<<sizeof(*a)<<endl; // 72 *a为一个有3*6个指针元素的数组
cout<<sizeof(**a)<<endl; // 24 **a为数组一维的6个指针
cout<<sizeof(***a)<<endl; // 4 ***a为一维的第一个指针
cout<<sizeof(****a)<<endl; // 8 ****a为一个double变量
数组也是一个指针,没加上一个*实际维数就减少1,特别在多维数组里面更明显,在上面,a是一个二维数组指针(a前面的*决定的),并且这个二维数组是一个指针数组(这是由于double后面的*决定的),那么,总共算起来从内层到外层就有四个*(本来内外各一个,再加上二维就是4个,而且蜕皮的顺序也是由内而外)
sizeof short:2
sizeof long:4
sizeof float:4sizeof WORD:2
sizeof DWORD:4
原因
WINDEF.H的定义:
typedef unsigned long DWORD;
typedef int BOOL;
typedef unsigned char BYTE;
typedef unsigned short WORD;
再ps下,上诉网页中关于最后sizeof(s4)作者的判断有误,为24
再再ps:发现上面的讲诉缺了点神马,然后再引述一个sizof函数的相关网页
size_t sz = sizeof( foo() ); // foo() 的返回值类型为char,所以sz = sizeof( char ),foo()并不会被调用
C99标准规定,函数、不能确定类型的表达式以及位域(bit-field)成员不能被计算sizeof值,即下面这些写法都是错误的:
sizeof( foo ); // error
void foo2() { }
sizeof( foo2() ); // error,没有返回值设置没有对其的命令#pragma pack(2) // 必须在结构体定义之前使用这个#pragma命令又有点说头了:#pragma百度百科其中作者用过的两种:一种是加载dll文件 #pragma comment(dll,"a.dll"),还有#pragma once
(4)指针传递内存
void GetMemory(char *p, int num)
{
p = (char *)malloc(sizeof(char) * num);
}
void Test(void)
{
char *str = NULL;
GetMemory(str, 100); // str 仍然为 NULL
strcpy(str, "hello"); // 运行错误
}//上述无法得到内存,由于传递不是指针的指针
void GetMemory2(char **p, int num)
{
*p = (char *)malloc(sizeof(char) * num);
}
void Test2(void)
{
char *str = NULL;
GetMemory2(&str, 100); // 注意参数是 &str,而不是str
strcpy(str, "hello");
cout<< str << endl;
free(str);
}