c语言最大的难题是指针和内存,这是难倒众多新手的关键地方,指针本身其实不难,难的是在开发中指针的逻辑变化。 指针移动代码片段 int * ip = NULL; ip += 1; //这个时候ip指针移动了sizeof(int)个字节 void * vp = NULL; vp += 1; //编译错误!
指针转换移动代码片段 unsigned int i = 0; unsigned char *p = (unsigned char *)&i; *(p + 0) = 255; *(p + 1) = 255; *(p + 2) = 255; *(p + 3) = 255;
指针指向内存边界代码片段 int arr[] = {0}; *(arr + 1) = 1314; arr++; //两个地方有问题
堆栈内存问题栈主要是用于逻辑计算、数据交换等,以及函数内定位的临时变量,这部分变量只会在当前作用域有效。堆内存通过malloc开辟,数据则是在一直存在,除非free和退出程序。注意栈溢出,不要把内存开销大的结构定义在栈上,因为栈的空间很小。 野指针代码片段 int * i = (int *)malloc(sizeof(int)); free(i); *i = 10;
野指针是致命问题,能够直接让程序崩溃。这只是一个简单的程序,当代码变得非常复杂的时候,容易出错的几率更大。 栈作用域问题代码片段 char* getstr() { char str[] = "abc"; return str; } char * p = getstr();
全局区作用域代码片段 char* getstr() { char * str = "abc"; return str; } char * p = getstr();
总结c 和 c++固然难学,只要用心去学习和理解,终会学会的!
|