数据结构:内存的使用

  1. p 和 "hello,world"存储在内存哪个区域?( ) (鲁科安全)

int main()

{

char *p = "hello,world";

return 0;

}

  1. p在栈区,因为p是一个局部变量。
  2. "hello,world"在代码段,因为"hello,world"是字符串常量。
  3. 一个由C/C++编译的程序,会将占用的内存分为几个部分:堆、栈、代码段、数据段、BSS段。请问以下程序中的变量a、b、c、d,分别被存在内存的哪个部分?(泰华智慧)

int a = 0;

char *b;

int main()

{

int c;

static char d = 'a';

b = malloc(10);

*b = d;

return 0;

}

  1. a在数据段,因为a是一个已初始化的全局变量。
  2. b在BSS段,因为b是一个未初始化的全局变量。
  3. c在栈区,因为c是一个局部变量。
  4. d在数据段,因为d是一个已初始化的static变量。
  5. 如下代码:变量g_iA,g_iB,g_iC,iD,iE, iF, piG,iH 分别在内存中的什么区( ) (H3C)

int g_iA = 1;

int g_iB;

static int g_iC = 1;

void func1(){

static int iD=2;

iD++;

int iE=2;

iE++;

}

void func2(){

int iF=3;

int *piG = (int*) malloc(4);

}

int main(){

int iH = 100;

}

  1. g_iA在数据段,因为g_iA是一个已初始化的全局变量。
  2. g_iB在bss段,因为g_iB是一个未初始化的全局变量。
  3. g_iC在数据段,因为g_iC是一个已初始化的static全局变量。
  4. iD在数据段,因为iD是一个已初始化的static局部变量。
  5. iE在栈区,因为iE是一个局部变量。
  6. iF在栈区,因为iF是一个局部变量。
  7. piG在堆区,因为piG是一个手动分配空间的变量。
  8. iH在栈区,因为iH是一个局部变量。
  9. 有关内存的思考题 (山东山大电力技术有限公司,登虹科技,昆腾微电子)

void GetMemory(char *p)

{

p =(char *)malloc(100);

}

void Test(void)

{

char *str=NULL;

GetMemory(str);

strcpy(str,"hello world");

printf(str);

}

请问运行 Test 函数会有什么样的结果?

在GetMemory函数中,p是一个局部变量,在栈区调用函数时自动分配空间,调用结束时自动释放空间,所以Test函数调用GetMemory函数得到的是一个野指针。

char * GetMemory(void)

{

char pl[] = "hello world"; //char *p = "hello world"

return p1;

}

Void Test(void)

{

char *str=NULL;

str = GetMemory();

printf(str);

}

请问运行 Test 函数会有什么样的结果?

在GetMemory函数中,p是一个局部变量,在栈区调用函数时自动分配空间,调用结束时自动释放空间,所以Test函数调用GetMemory函数得到的是一个野指针。

void GetMemory(char **p,int num)

{

*p = (char *)malloc(num);

}

void Test(void)

{

char *str = NULL;

GetMemory(&str, 100);

strcpy(str, "hello world");

printf(str);

}

请问运行 Test 函数会有什么样的结果?

在GetMemory函数中,p是一个在堆区手动分配空间的变量,但是malloc在申请空间时有可能失败,代码中没有判断,所以Test函数调用GetMemory函数时可能成功并输出hello world,也有可能申请空间失败导致的到一个野指针。

void Test (void)

{

char *str = (char *)malloc(100);

strcpy(str,"hello");

free(str);

if(str != NULL)

{

strcpy(str, "world");

printf(str);

}

}

请问运行 Test 函数会有什么样的结果?

在Test函数中,先在堆区手动申请了100字节的字符空间,然后又手动释放了空间,但是释放之后并没有指向NULL,所以释放之后是一个野指针。

  1. 堆和栈的区别是什么? (矩阵软件)
  2. 空间管理分配不同:栈区自动分配和释放空间,堆区手动分配和释放空间。
  3. 运行效率不同:因为栈区自动分配和释放空间,堆区手动分配和释放空间,所以栈区的效率比堆区快。
  4. 增长方式不同:栈区向下增长,堆区向上增长。
  5. 什么是内存泄漏?面对内存泄漏和指针越界,你有哪些方法?(山大华天,智洋创新)
    内存泄漏是指在程序中已分配的堆内存,由于某种原因未能被释放或无法访问,从而造成内存中的无用数据持续占用物理内存空间,导致可使用的内存空间逐渐减少的现象。

解决内存泄漏:①使用free()函数释放内存,

②合理设计数据结构和算法,避免内存无限增长,

③设置合理的变量作用域,减少内存占用。

解决指针越界:①数组边界检查,确保在使用数组时下标在数组的有效范围内,

②使用指针初始化来检查,

③使用strncpy和strncat可以确保不会溢出目标缓冲区。

相关推荐
PEI04几秒前
MVCC(多版本并发控制)
java·开发语言·数据库
天选之女wow7 分钟前
【代码随想录算法训练营——Day4】链表——24.两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题02.07.链表相交、142.环形链表II
数据结构·算法·leetcode·链表
胡萝卜3.09 分钟前
数据结构初阶:树的相关性质总结
数据结构·二叉树·性质·二叉树的性质
KarrySmile12 分钟前
Day12--HOT100--23. 合并 K 个升序链表,146. LRU 缓存,94. 二叉树的中序遍历
数据结构·链表·二叉树·递归·hot100·lru·灵茶山艾府
熊猫钓鱼>_>24 分钟前
2025反爬虫之战札记:从robots.txt到多层防御的攻防进化史
开发语言·c++·爬虫
61900833641 分钟前
linux离线安装elasticsearch8.19.3
linux
牛十二1 小时前
mac-intel操作系统go-stock项目(股票分析工具)安装与配置指南
开发语言·前端·javascript
励志不掉头发的内向程序员1 小时前
从零开始的python学习——文件
开发语言·python·学习
恒森宇电子有限公司1 小时前
IP5326_BZ 支持C同口输入输出的移动电源芯片 2.4A的充放电电流 支持4LED指示灯
c语言·开发语言·单片机
曼巴UE51 小时前
UE5.3 C++ 接口初步使用
开发语言·jvm·c++