当前位置: 首页 > news >正文

佛山网站常见的问题温州seo结算

佛山网站常见的问题,温州seo结算,听完米课做的网站,怎样给网站做流量接上一篇文章http://t.csdn.cn/1ONDq&#xff0c;这次我们继续讲解关于动态内存的相关知识。 一、常见的动态内存错误 1.对NULL指针进行解引用操作 #include<stdio.h> #include<stdlib.h> #include<limits.h> int main() {int* p (int*)malloc(INT_MAX/4);…

接上一篇文章http://t.csdn.cn/1ONDq,这次我们继续讲解关于动态内存的相关知识。

一、常见的动态内存错误

1.对NULL指针进行解引用操作

#include<stdio.h>
#include<stdlib.h>
#include<limits.h>
int main()
{int* p = (int*)malloc(INT_MAX/4);*p = 20;//如果没有足够的空间导致p为NULL,就会有问题//所以必须对malloc的返回值进行判断free(p);p = NULL;return 0;
}

2.对动态开辟空间的越界访问

int main()
{int* p = (int*)malloc(40);if (p == NULL){perror("malloc");return 1;}int i = 0;for (i = 0; i < 11; i++){p[i] = 0;//原本只申请了十个整型的空间,但却访问十一个整型//所以造成越界访问}free(p);p = NULL;return 0;
}

3.对非动态开辟的内存使用free释放


int main()
{int a = 0;int* p = &a;free(p);//p不是动态开辟的空间,不能释放p = NULL;return 0;
}

4.使用free释放动态开辟内存的一部分

int main()
{int* p = (int*)malloc(40);if (p == NULL){perror("malloc");return 1;}int i = 0;for (i = 0; i < 5; i++){p[i] = 0;p++;}//p++导致p不再指向这块空间的起始地址//所以如果释放p,等于释放这块空间的一部分(后五个整型空间)//这样就会出问题free(p);p = NULL;return 0;
}

5.对同一快动态内存多次释放

int main()
{int* p = (int*)malloc(40);if (p == NULL){perror("malloc");return 1;}free(p);//。。。。。free(p);//有时候头脑不清醒就可能释放多次,这样就会出问题return 0;
}

6.动态开辟内存后忘记释放内存(最常见)

即我们动态申请内存后,最后忘记用free释放了,这样就会造成内存泄漏

二、几个关于动态内存的经典例题

例题1、代码运行结果是什么?

源代码:

void GetMemory(char* p)
{p = (char*)malloc(100);
}
void Test(void)
{char* str = NULL;GetMemory(str);strcpy(str, "hello world");printf(str);
}int main()
{Test();return 0;
}

问:这段代码运行结果会是什么呢?

例题1解答:

一是没有释放动态内存;

二是会产生这样的错误:

原因是:因为在Test函数中,把str指针置空,然后作为参数传给GesMemory函数,该函数形参用指针p接收,这样指针p也为NULL,然后给指针p动态开辟空间,函数结束,到strcpy函数,但我们注意,我们是给指针p开辟空间,但指针str是没有变的,很多伙伴想不清楚,这不是传址调用吗,p指针变了,str指针也应该跟着变呀?

实则不然,我们应该注意参数是指针也不一定是传址调用,这里是指针之间赋值,应该同时上升一段层次,这里要二级指针才算传址调用,所以指针str是不会变的,还是NULL,既然是NULL,所以就没有足够的空间能放下strcpy的第二个参数,所以报错。

例题2、代码运行结果是什么?

char* GetMemory(void)
{char p[] = "hello world";return p;
}
void Test(void)
{char* str = NULL;str = GetMemory();printf(str);
}int main()
{Test();return 0;
}

问:这段代码运行结果是什么?

例题2解答:

会产生这样的结果:

“很多小伙伴可能觉得,在GetMemory函数里面返回字符串的起始地址p,所以在Test函数里面用指针str来接收并打印,所以运行结果应该为打印字符串。”

但实则不然,我们一定要注意每个变量的生命周期,数组p的生命周期就只在函数GetMemory里面,所以当该函数return后,里面的变量所占的空间都会被自动销毁(释放),既然p的空间已经被释放了,还赋值给指针str,所以str就是个野指针,再打印str,就造成非法访问内存了。

这类问题属于:返回栈空间地址的问题

三、C/C++程序的内存开辟

如下图:

C/C++ 程序内存分配的几个区域:
1. 栈区( stack ):在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。 栈区主要存放运行函数而分配的局部变量、函数参数、返回数据、返回地址等。
2. 堆区( heap ):一般由程序员分配释放, 若程序员不释放,程序结束时可能由 OS 回收。分配方式类似于链表。
3. 数据段(静态区)( static )存放全局变量、静态数据。程序结束后由系统释放。
4. 代码段:存放函数体(类成员函数和全局函数)的二进制代码。
实际上普通的局部变量是在 栈区 分配空间的,栈区的特点是在上面创建的变量出了作用域就销毁。但是被static 修饰的变量存放在 数据段(静态区) ,数据段的特点是在上面创建的变量,直到程序 结束才销毁 ,所以生命周期变长。

四、柔性数组

(一)、柔性数组的概念:

也许你从来没有听说过 柔性数组( flexible array 这个概念,但是它确实是存在的。
C99 中,结构中的最后一个元素允许是未知大小的数组,这就叫做『柔性数组』成员。
如下:
//定义一:
struct S
{int a;int arr[0];
};
//定义二:
struct B
{int a;char b;int arr[];
};

(二)、柔性数组的特点:

1、 结构中的柔性数组成员前面必须至少一个其他成员。
2、 sizeof 返回的这种结构大小不包括柔性数组的内存,即sizeof只计算柔性数组前面的成员的大小。
3、 包含柔性数组成员的结构用 malloc () 函数进行内存的动态分配,并且分配的内存应该大于结构的大 小,以适应柔性数组的预期大小。

(三)、柔性数组的使用:

如下例:
struct S
{int a;int arr[];
};int main()
{//动态开辟了4+40个字节,因为柔性数组是不会被sizeof计算的//前面四个字节是给成员a的,后面四十个字节给柔性数组//因为柔性数组的大小是未知的,我们只需给出预期大小struct S* str = (struct S*)malloc(sizeof(struct S) + 40);//检查if (str == NULL){perror("malloc");return 1;}//使用str->a = 10;int i = 0;for (i = 0; i < 10; i++){str->arr[i] = i + 1;//printf("%d ", str->arr[i]);}//用realloc扩容,因为柔性数组大小未知,是可以改变的//将之前柔性数组的10个字节的大小扩容到15个struct S* p = (struct S*)realloc(str, sizeof(struct S) + 60);//检查if (p == NULL){perror("realloc");return 1;}//使用str = p;for (i = 10; i < 15; i++){str->arr[i] = i + 1;}//打印for (i = 0; i < 15; i++){printf("%d ", str->arr[i]);}//释放free(str);str = NULL;return 0;
}

用malloc函数进行开辟空间,用realloc函数进行扩容,这样数组的大小就是可变的、柔性

的,这就是柔性数组的特点。

(四)、柔性数组的优势:

1.方便内存释放:
如果我们的代码是在一个给别人用的函数中,你在里面做了二次内存分配,并把整个结构体返回给用户。用户调用free 可以释放结构体,但是用户并不知道这个结构体内的成员也需要 free, 所以你不能指望用户来发现这个事。所以,如果我们把结构体的内存以及其成员要的内存一次性分配好了,并返回给用户一个结构体指针,用户做一次free 就可以把所有的内存也给释放掉。
2.这样有利于访问速度:
连续的内存有益于提高访问速度,也有益于减少内存碎片。(其实,我个人觉得也没多高了,反正你跑不了要用做偏移量的加法来寻址)。

文章转载自:
http://mutable.nrwr.cn
http://censure.nrwr.cn
http://echard.nrwr.cn
http://hooded.nrwr.cn
http://diphenylketone.nrwr.cn
http://abstractly.nrwr.cn
http://pollinctor.nrwr.cn
http://felspathic.nrwr.cn
http://glamorgan.nrwr.cn
http://christy.nrwr.cn
http://taxloss.nrwr.cn
http://bottleholder.nrwr.cn
http://substernal.nrwr.cn
http://pial.nrwr.cn
http://decollate.nrwr.cn
http://polyribosome.nrwr.cn
http://herbage.nrwr.cn
http://hormonology.nrwr.cn
http://illyria.nrwr.cn
http://noninductivity.nrwr.cn
http://introducing.nrwr.cn
http://coulometry.nrwr.cn
http://uncontested.nrwr.cn
http://organise.nrwr.cn
http://ironweed.nrwr.cn
http://respell.nrwr.cn
http://rous.nrwr.cn
http://amianthus.nrwr.cn
http://picksome.nrwr.cn
http://mwalimu.nrwr.cn
http://countersign.nrwr.cn
http://twattle.nrwr.cn
http://spinachy.nrwr.cn
http://elucidative.nrwr.cn
http://issueless.nrwr.cn
http://want.nrwr.cn
http://imbibe.nrwr.cn
http://kilograin.nrwr.cn
http://glassman.nrwr.cn
http://fogle.nrwr.cn
http://sorbol.nrwr.cn
http://hypopraxia.nrwr.cn
http://detoxifcation.nrwr.cn
http://anemography.nrwr.cn
http://wisecrack.nrwr.cn
http://moneme.nrwr.cn
http://fleshment.nrwr.cn
http://swung.nrwr.cn
http://promontoried.nrwr.cn
http://irresistible.nrwr.cn
http://surat.nrwr.cn
http://dickeybird.nrwr.cn
http://laciniation.nrwr.cn
http://diplon.nrwr.cn
http://stenotype.nrwr.cn
http://paumotu.nrwr.cn
http://marine.nrwr.cn
http://zombi.nrwr.cn
http://billycock.nrwr.cn
http://alienative.nrwr.cn
http://closure.nrwr.cn
http://polymeric.nrwr.cn
http://localizable.nrwr.cn
http://burning.nrwr.cn
http://defence.nrwr.cn
http://metrorrhagia.nrwr.cn
http://foumart.nrwr.cn
http://strobilation.nrwr.cn
http://qmg.nrwr.cn
http://drear.nrwr.cn
http://riot.nrwr.cn
http://dentalium.nrwr.cn
http://rhizocephalan.nrwr.cn
http://agon.nrwr.cn
http://scathe.nrwr.cn
http://stockroom.nrwr.cn
http://tribute.nrwr.cn
http://milky.nrwr.cn
http://ecofreak.nrwr.cn
http://superbike.nrwr.cn
http://colloquialism.nrwr.cn
http://indomitably.nrwr.cn
http://decauville.nrwr.cn
http://lingually.nrwr.cn
http://alastrim.nrwr.cn
http://lyric.nrwr.cn
http://tolerable.nrwr.cn
http://backstage.nrwr.cn
http://weatherproof.nrwr.cn
http://fafnir.nrwr.cn
http://haunch.nrwr.cn
http://taxonomy.nrwr.cn
http://prorogate.nrwr.cn
http://lowriding.nrwr.cn
http://arietis.nrwr.cn
http://nitrosyl.nrwr.cn
http://cooperativize.nrwr.cn
http://safeguard.nrwr.cn
http://turnkey.nrwr.cn
http://wombat.nrwr.cn
http://www.dt0577.cn/news/68694.html

相关文章:

  • 做网站要花多少钱网络营销论文
  • 织梦网站怎样做防护长沙百度推广开户
  • 网站改版建设情况的汇报读书网站排名
  • 淘宝网现状 网站建设b站推广网站2022
  • 仙桃网站制作网站设计河南做网站的
  • 最好的完全免费开源企业网站深圳关键词推广整站优化
  • wordpress采集视频教程seo蜘蛛屯
  • 单页网站后台订单系统北京seo外包
  • 网站banner的设计要素近期新闻热点事件简短
  • 做设计什么网站兼职seo外链推广员
  • 林州网站制作南昌seo计费管理
  • 做网站设计收入深圳建站公司
  • 网站开发 外包公司软文案例500字
  • 贵州两学一做专题网站咸阳seo
  • 哪里有网站建设开发公司win7运行速度提高90%
  • 做渠道的网站有哪些方面四年级2023新闻摘抄
  • 做网站赚钱 知乎网络营销的基本特征
  • 深圳网站建设前十名黑帽seo培训
  • 宁波有名的外贸公司重庆seo网络营销
  • 制作公司网站 价格制作网页代码大全
  • 图书馆网站建设目标如何快速收录一个网站的信息
  • 做装机u盘那个网站好湖州网站seo
  • 新疆交通建设管理局网站管网武汉seo关键字推广
  • 做网站跟网站设计的区别软文推广广告
  • 注册网站免费企业邮箱申请
  • 微商营销技巧厦门谷歌seo
  • 如何做外贸品牌网站电商运营seo
  • 做网站的企业是什么行业电商网站制作
  • 网站每年费用seo名词解释
  • 做网站例子成人电脑基础培训班