1.p 和 "hello,world"存储在内存哪个区域?( ) (鲁科安全)
int main()
{
char *p = "hello,world";
return 0;
}
答:"hello,word"存储在静态区全局区中的.ro区
2.一个由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;
}
答:
a 存在静态区全局区中的.data区域
b 存在静态区全局区中的.bss区域
c 存储在栈区
d 存储在静态全局区中的.data区域
b 指向的是堆内存的区域,本身是在静态全局区的.bss区域
3.如下代码:变量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;
}
答:
g_iA 再静态全局区中的 .data区域
g_iB 在静态全局区中的 .bss区域
g_iC 在静态全局区中的 .data区域
iD 在静态全局区中的 .data区域
iE 在栈区
iF 在栈区
piG 本身在栈区域,指向的内存是在堆区域
iH 在栈区
4.有关内存的思考题 (山东山大电力技术有限公司,登虹科技,昆腾微电子)
void GetMemory(char *p)
{
p =(char *)malloc(100);
}
void Test(void)
{
char *str=NULL;
GetMemory(str);
strcpy(str,"hello world");
printf(str);
}
答:会发生段错误,因为函数中的p指向的别的区域地址并没有影响到str所以str依然是空,访问空地址会出现段错误
char * GetMemory(void)
{
char pl[] = "hello world"; //char *p = "hello world"
return p1;
}
Void Test(void)
{
char *str=NULL;
str = GetMemory();
printf(str);
}
答:会发生段错误,因p1是数组,数组属于局部变量,局部变量离开函数就会被销毁,那么str指向的就是一个野指针,对野指针访问会出现段错误
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);
}
答:结果是hello word
**p指向的是str的地址,所以对*p分配内存就是给str分配内存
void Test (void)
{
char *str = (char *)malloc(100);
strcpy(str,"hello");
free(str);
if(str != NULL)
{
strcpy(str, "world");
printf(str);
}
}
请问运行 Test 函数会有什么样的结果?
答:结果为"world"
5.堆和栈的区别是什么? (矩阵软件)
(1)首先栈是有计算机区管理分配释放内存的,不需要程序员区操心,而堆内存需要程序员手动通过malloc和free去申请和释放内存,容易造成内存泄漏,效率低
(2)栈是由高地址到低地址扩展的数据结构,内存是连续的,而堆内存是由低到高扩展的数据结构,内存是不连续的
(3)因为堆内存的分配是不连续的所以在分配的时候各个内存之间会有内存碎片,如果进行大量的申请和释放操作势必会造成大量的内存碎片导致程序运行效率缓慢,而栈因为是连续的一个内存分配完后紧接着是下一个内存所以不会有内存碎片的问题
(4)栈内存是向下的,即向着内存地址减小的方向,堆内存是向上的,即向着内存地址上升的方向
6.什么是内存泄漏?面对内存泄漏和指针越界,你有哪些方法?(山大华天,智洋创新)
答:内存泄漏是由于动态分配的内存没有得到释放,一直占用系统的资源所导致的
其中没有释放的原因有
1.动态内存的首地址丢失导致没有释放
2.每循环一次都会泄漏一次内存
3.非法访问常量去
解决方法:
1.及时的使用free释放不再使用的动态内存
2.使用合理的数据结构和算法,避免内存会无限制的增长
3.设置合理的变量,减少内存占用