C语言中存储空间分配问题

问题描述

C语言中存储空间分配问题

看书上说声明的变量只是在函数存在的时间有效,函数返回时就会被释放。
然后我就试了一下,代码如下:

#include<stdio.h>
int f(int **iptr)
{
 int a=10;
 *iptr=&a;
 return 0;
}
int main()
{
int **jptr;
f(jptr);
printf("%i
",**jptr);
}

按理说不应该是f函数结束后变量a就会被释放,此时*iptr应该是一个悬空指针啊,为什么我编译运行程序的时候
还是可以输出a的值为10,谢谢啦,这里不是很理解。

解决方案

释放并不代表清空该内存。
只是将此内存归还给操作系统。
指向的内存标记为*可用*,操作系统掌控,内容没有意义.不会主动变化(清0).直到再次分配后可能又会用到这部分.
(可能也和内存分配回收策略有关,出于效率考虑)

楼主这样的做法属于未定义的行为,如果你访问的区域已经重新被别的变量使用,那么可能导致程序崩溃

解决方案二:

的确是释放了,但是不会被清零。因为你没有调用别的函数,堆栈收缩了,所以堆栈顶上的值没有被别的数据覆盖,还能访问。

解决方案三:

释放和清零是两个概念,释放只是说明这个内存可以被再次使用,好比你删除文件。文件删除了,但是写文件的扇区不会被清零,如果没有新的数据写入,你还可以用文件恢复软件找回删除的文件。

解决方案四:

C语言的指针可以随便访问,它才不管这些内存是否合法,不要说访问释放过的内存,就是压根没有申请的内存都可以:
int x = 1;
int *p = &(x + 1); //明显这个指针指向的这个地方根本不是一个变量。

解决方案五:

C语言的指针可以随便访问,它才不管这些内存是否合法,不要说访问释放过的内存,就是压根没有申请的内存都可以:
int x = 1;
int *p = &x + 1; //明显这个指针指向的这个地方根本不是一个变量。

解决方案六:

1.a 是被释放了没有错的;
2. f 传参是传入的一个地址,在里面把a的地址给它了;
3.所以你后面输出的就是在f里传来的值;

解决方案七:

【C语言】结构体存储与空间分配
C语言 结构体存储空间分配

时间: 2024-11-10 00:32:10

C语言中存储空间分配问题的相关文章

C语言中局部变量与全局变量在内存中的存放位置

C语言中局部变量和全局变量变量的存储类别(static,extern,auto,register) 1----局部变量和全局变量 在讨论函数的形参变量时曾经提到,形参变量只在被调用期间才分配内存单元,调用结束立即释放.这一点表明形参变量只有在函数内才是有效的,离开该函数就不能再使用了.这种变量有效性的范围称变量的作用域.不仅对于形参变量,C语言中所有的量都有自己的作用域.变量说明的方式不同,其作用域也不同.C语言中的变量,按作用域范围可分为两种,即局部变量和全局变量. 1.1局部变量 局部变量也

java-C语言中顺序线性表的合并

问题描述 C语言中顺序线性表的合并 结构体类型变量作为函数参数只能作为指针传递吗?为什么我写一个函数参数是结构体,下面引用时报错 typedef struct { char name[10]; char sex; long num; }ElemType;//自定义元素类型. typedef struct{ ElemType *elem;//存储空间基址. int length;//当前长度. int listsize;//当前分配的存储容量(以sizeof(ElemType)为单位). }SqL

深入浅析C语言中堆栈和队列_C 语言

1.堆和栈 (1)数据结构的堆和栈 堆栈是两种数据结构. 栈(栈像装数据的桶或箱子):是一种具有后进先出性质的数据结构,也就是说后存放的先取,先存放的后取.这就如同要取出放在箱子里面底下的东西(放入的比较早的物体),首先要移开压在它上面的物体(放入的比较晚的物体). 堆(堆像一棵倒过来的树):是一种经过排序的树形数据结构,每个结点都有一个值.通常所说的堆的数据结构,是指二叉堆.堆的特点是根结点的值最小(或最大),且根结点的两个子树也是一个堆.由于堆的这个特性,常用来实现优先队列,堆的存取是随意,

C语言中的内存分配与释放

对C语言一直都是抱着学习的态度,很多都不懂,今天突然被问道C语言的内存分配问题,说了一些自己知道的,但感觉回答的并不完善,所以才有这篇笔记,总结一下C语言中内存分配的主要内容. 相关问题 刚刚在一篇博文看到一个简单的问题: //code1 char* toStr() { char *s = "abcdefghijkl"; return s; } int main() { cout << toStr() << endl; return 0; } //code2 c

深入探讨C语言中局部变量与全局变量在内存中的存放位置_C 语言

C语言中局部变量和全局变量变量的存储类别(static,extern,auto,register) 1.局部变量和全局变量在讨论函数的形参变量时曾经提到,形参变量只在被调用期间才分配内存单元,调用结束立即释放.这一点表明形参变量只有在函数内才是有效的,离开该函数就不能再使用了.这种变量有效性的范围称变量的作用域.不仅对于形参变量,C语言中所有的量都有自己的作用域.变量说明的方式不同,其作用域也不同.C语言中的变量,按作用域范围可分为两种,即局部变量和全局变量.1.1局部变量局部变量也称为内部变量

浅析C语言中的数组及字符数组_C 语言

我们来编写一个程序,以统计各个数字.空白符(包括空格符.制表符及换行符)以及所有其它字符出现的次数.这个程序的实用意义并不大,但我们可以通过该程序讨论 C 语言多方面的问题. 所有的输入字符可以分成 12 类,因此可以用一个数组存放各个数字出现的次数,这样比使用 10 个独立的变量更方便.下面是该程序的一种版本: #include <stdio.h> /* count digits, white space, others */ main() { int c, i, nwhite, nothe

C语言中基础小问题详细介绍_C 语言

1.printf格式输出函数 如果格式控制说明项数多于输出表列个数,则会输出错误数据:如果输出表列个数多于格式控制说明数,则多出数不被输出.%md,m指的是输出字段的宽度.如果输出字段位数小于m,则左端以空格补齐,若大于m,则按照实际位数输出.%-md,基本同上,只不过不同之处在于,空格在右端补齐printf参数可以是常量,变量或表达式,VC++ 6.0中采用从右向左顺序求值,从左向右输出如 复制代码 代码如下: int x = 5; printf("%4d%4d%4d", x, ++

指针-c语言中字符数组初始化问题

问题描述 c语言中字符数组初始化问题 字符数组初始化1: char str[]=""123"";//不报错2: char str[4]; str=""123"";//不能将const char[4] to char[4]字符指针初始化1: char *str=""123"";//不报错2: char *str; str=""123"";//不报错求

c语言中 如何让7/3的结果输出2.3

问题描述 c语言中 如何让7/3的结果输出2.3 c语言中 如何让7/3的结果输出2.3.初学者求教 在线等 解决方案 #include <stdio.h> int main() { printf("%.1f",7/(float)3); } 解决方案二: printf("%.1f", 1.0 * 7 / 3); 解决方案三: printf("%f",((float)7/3)); 解决方案四: printf("%.2f&quo