问题:1.p 和 "hello,world"存储在内存哪个区域?( ) (鲁科安全)
int main()
{
char *p = "hello,world";
return 0;
}
答案:p存储在栈区,字符串存储在静态/全局区的.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显然储存在堆区
c为局部变量,储存在栈区
d为已初始化的static变量,储存在静态/全局区的,data段
问题: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;
}
答案:A为已初始化全局变量,静态/全局区.data段
B为未初始化全局变量,静态/全局区.bss段
C为已初始化的静态全局变量,静态/全局区.data段
D为已初始化的静态局部变量, 静态/全局区.data段
E为局部变量,栈区
F为局部变量,栈区
G为指针,栈区
H为局部变量,栈区
问题:4.有关内存的思考题 (山东山大电力技术有限公司,登虹科技,昆腾微电子)
void GetMemory(char *p)
{
p =(char *)malloc(100);
}
void Test(void)
{
char *str=NULL;
GetMemory(str);
strcpy(str,"hello world");
printf(str);
}
请问运行 Test 函数会有什么样的结果?
会输出hello world
char * GetMemory(void)
{
char pl[] = "hello world"; //char *p = "hello world"
return p1;
}
Void Test(void)
{
char *str=NULL;
str = GetMemory();
printf(str);
}
请问运行 Test 函数会有什么样的结果?
野指针,p1是局部参数被返回了
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 函数会有什么样的结果?
会输出hello world
void Test (void)
{
char *str = (char *)malloc(100);
strcpy(str,"hello");
free(str);
if(str != NULL)
{
strcpy(str, "world");
printf(str);
}
}
请问运行 Test 函数会有什么样的结果?
答案:if的判定结果将变得随机,因为str已经被释放空间,是野指针
- 堆和栈的区别是什么? (矩阵软件)
答案:栈区由电脑自动分配和释放空间,更高效,而堆区是手动分配和释放。栈区的存储空间分配是连续的,不易产生碎片;堆区的存储空间不是连续的,时间长了会产生碎片。栈区是向下生长的,堆区是向上生长的。两个都是重复使用的空间,使用完毕不会清理,会产生脏内存。
- 什么是内存泄漏?面对内存泄漏和指针越界,你有哪些方法?(山大华天,智洋创新)
答案:内存泄漏是使用完堆区的空间没有释放导致的,会拖慢系统性能并最终导致崩溃。办法是:避免野指针,使用完指针并释放后,要及时初始化空指针;确认指针的作用域,没有指向局部变量;还要及时更新指针。避免内存泄漏,使用完要及时free()释放内存;设计合理的代码,避免内存无限增长;设定好作用域,以减少空间的使用。