您的位置 首页 资料

C言语内存运用

:内存使用有人写了一个将整数转换为字符串的函数:char *itoa (int n){char retbuf[20];sprintf(retbuf, %d, n);return retbuf;}如果我

内存运用

有人写了一个将整数转化为字符串的函数:

char *itoa (int n)

{

char retbuf[20];

sprintf(retbuf, %d, n);

return retbuf;

}

假如我调用这个函数:char *str5 = itoa(5),str5会是什么成果呢?

答案剖析:

答案是不确认,能够确认的是必定不是咱们想要的 “5”。

retbuf界说在函数体中,是一个局部变量,它的内存空间坐落栈(stack)中的某个方位,其效果规模也仅限于在itoa()这个函数中。当itoa()函数退出时,retbuf在调用栈中的内容将被回收,这时,这块内存地址或许寄存其他内容。因而将retbuf这个局部变量回来给调用者是达不到预期的意图的。

那么怎么处理这个问题呢,不必忧虑,方法不光有,并且还不止一个,下面就来论述三种能处理这个问题的方法:

1)、在itoa()函数内部界说一个static char retbuf[20],依据静态变量的特性,咱们知道,这能够确保函数回来后retbuf的空间不会被回收,原因是函数内的静态变量并不是放在栈中,而是放在程序中一个叫“.bss”段的当地,这个当地的内容是不会因为函数退出而被回收的。

这种方法的确能处理问题,可是这种方法一起也导致了itoa()函数变成了一个不行重入的函数(即不能确保相同的输入必定有相同的输出),别的, retbuf [] 中的内容会被下一次的调用成果所代替,这种方法不值得引荐。

2)、在itoa()函数内部用malloc() 为retbuf请求内存,并将成果寄存其间,然后将retbuf回来给调用者。因为此刻retbuf坐落堆(heap)中,也不会跟着函数回来而开释,因而能够到达咱们的意图。

可是有这样一种状况需求留意:itoa()函数的调用者在不需求retbuf的时分有必要把它开释,不然就形成内存走漏了,假如此函数和调用函数都是同一个人所写,问题不大,但假如不是,则比较简略会遗漏此开释内存的操作。

3)、将函数界说为char *itoa(int n, char *retbuf),且retbuf的空间由调用者请求和开释,itoa()仅仅将转化成果寄存到retbuf罢了。

这种方法显着比榜首、二种方法要好,既避免了方法1对函数的影响,也避免了方法2对内存分配开释的影响,是现在一种比较通行的做法。

扩展剖析:

其实就这个问题自身而言,我想我们都能够马上想到答案,关键在于对内存这种灵敏资源的正确和合理地运用,下面对内存做一个简略的剖析:

1)、程序中有不同的内存段,包含:

.data – 已初始化大局/静态变量,在整个软件履行过程中有用;

.bss – 未初始化大局/静态变量,在整个软件履行过程中有用;

.stack – 函数调用栈,其间的内容在函数履行期间有用,并由编译器担任分配和回收;

.heap – 堆,由程序显式分配和回收,假如不回收便是内存走漏。

2)、自己运用的内存最好仍是自己请求和开释。

这能够说是一个内存分配和开释的准则,比如说上面处理方法的第二种,由itoa()分配的内存,最后由调用者开释,就不是一个很好的方法,还不如用第三种,由调用者自己请求和开释。别的这个准则还有一层意思是说:假如你要运用一个指针,最好先坚信它现已指向合法内存区了,假如没有就得自己分配,要不便是不合法指针拜访。许多程序的丧命过错都是拜访一个没有指向合法内存区的指针,这也包含空指针。

问题:内存分配 sizeof

我运用sizeof来核算一个指针变量,我期望得到这个指针变量所分配的内存块的巨细,能够吗?

Char *p = NULL;

int nMemSize = 0;

p = malloc(1024);

nMemSize = sizeof(p);

答案与剖析:

答案是达不到你的要求,sizeof只能告知你指针自身占用的内存巨细。指针所指向的内存,假如是malloc分配的,sizeof 是没有方法知道的。换句话说,malloc分配的内存是没有方法向内存办理模块进行过后查询的,当然你能够自己编写代码来保护。

问题:栈内存运用

下面程序运转有什么问题?

char *GetString(void)

{

char p[] = hello world;

return p;// 编译器将提出正告

}

void Test4(void)

{

char *str = NULL;

str = GetString();// str 的内容是废物

cout str endl;

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ziliao/152003.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部