一道题目复习知识点
int globalVar = 1;
static int staticGlobalVar = 1;
void Test()
{
static int staticVar = 1;
int localVar = 1;
int num1[10] = {1, 2, 3, 4};
char char2[] = "abcd";//这里char2是指针,数组的指针指向数组第一个元素地址,char2数组是,把一个常量字符串拷贝过去,*char2是首元素,是数组的第一个元素
char* pChar3 = "abcd";//其实这里前面需要加上一个const,这里pchar是一个指针,指向常量字符串
int* ptr1 = (int*)malloc(sizeof (int)*4);
int* ptr2 = (int*)calloc(4, sizeof(int));
int* ptr3 = (int*)realloc(ptr2, sizeof(int)*4);
free (ptr1);
free (ptr3);
}
选项: A.栈 B.堆 C.数据段(静态区) D.代码段(常量区)globalVar在哪里? CstaticGlobalVar在哪里? CstaticVar在哪里? ClocalVar在哪里? Anum1 在哪里? Achar2在哪里? A*char2在哪里? ApChar3在哪里? A*pChar3在哪里? Dptr1在哪里? A*ptr1在哪里? Bsizeof(num1) =40sizeof(char2) =5strlen(char2) = 4sizeof(pChar3) = 4strlen(pChar3) =4sizeof(ptr1) = 4
由于c语言中动态申请太麻烦所以C++引入新的
二、new 1. 与malloc比较c语言动态开辟太麻烦
引入new
int main()
{
int* a = (int*)malloc(sizeof(int) * 4);
int* b = new int(5);//申请1个int,里面放5
int* c = new int[4];//申请5个int
free(a);
delete b;
delete[] c;
//delete c 如果是内置类型不会报错,如果是自定义类型会报错
return 0;
}
在内置类型上基本没有区别C++98不支持初始化数组,C++11可以支持初始化数组,类似b那样的初始化cnew对象的时候会调用类的构造函数,delete时候会调用析构函数
2. 动态内存开辟失败
malloc开辟失败会返回空
int main()
{
// 面向对象的语言,处理错误的方式一般是抛异常,C++中也要求出错抛异常 -- try catch
// 面向过程的语言,处理错误的方式是什么-》返回值+错误码解决
char* p1 = (char*)malloc(1024u*1024u*1024u*2u);
if (p1 == nullptr)
{
printf("%dn", errno);
perror("malloc fail");
exit(-1);
}
else
{
printf("%pn", p1);
}
return 0;
}
new开辟失败是会抛错误
这里是抛异常捕获的方法,catch只会捕获try内的东西
int main()
{
try
{
//例子不唯一,抛了异常会直接跳到catch那,print不会执行
double* p1 = new double[1024u * 1024u * 1024u];
printf("%pn", p1);
}
catch (const exception& e)
{
cout << e.what() << endl;
}
return 0;
}



