数据结构:内存的使用

  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可以确保不会溢出目标缓冲区。

相关推荐
同学小张4 小时前
【端侧AI 与 C++】1. llama.cpp源码编译与本地运行
开发语言·c++·aigc·llama·agi·ai-native
踢球的打工仔4 小时前
PHP面向对象(7)
android·开发语言·php
t198751286 小时前
在Ubuntu 22.04系统上安装libimobiledevice
linux·运维·ubuntu
skywalk81636 小时前
linux安装Code Server 以便Comate IDE和CodeBuddy等都可以远程连上来
linux·运维·服务器·vscode·comate
汤姆yu7 小时前
基于python的外卖配送及数据分析系统
开发语言·python·外卖分析
Yue丶越7 小时前
【C语言】字符函数和字符串函数
c语言·开发语言·算法
晚风吹人醒.7 小时前
缓存中间件Redis安装及功能演示、企业案例
linux·数据库·redis·ubuntu·缓存·中间件
翔云 OCR API7 小时前
人脸识别API开发者对接代码示例
开发语言·人工智能·python·计算机视觉·ocr
V***u4537 小时前
MS SQL Server partition by 函数实战二 编排考场人员
java·服务器·开发语言
Hard but lovely7 小时前
linux: pthread库的使用和理解
linux