1.p 和 "hello,world"存储在内存哪个区域?( )
int main()
{
char *p = "hello,world";
return 0;
}
答:p存储在栈区,“hello,world”存储在静态区中的.ro段
分析:p是一个指针,属于局部变量所以存储在栈区;“hello,world”是一个字符串常量,存储在静态区的.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和b存储在BSS段、c存储在栈区、d存储在data段
分析:a是未初始化的全局变量存储在BSS段中,b也是未初始化的全局变量存储在BSS段中,但其指向的内存开辟在堆区,c是局部变量存储在栈区,d是已初始化的static变量存储在data段中,
3.如下代码:变量g_iA,g_iB,g_iC,iD,iE, iF, piG,iH 分别在内存中的什么区( )
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、g_iC、iD在静态区data段中,piG本身存储在栈区,但内存指向堆区,g_iB在静态区BSS段中,iE、iF、iH在栈区
分析:g_iA、g_iC、iD分别是已初始化的全局变量、已初始化的static全局变量和已初始化的static局部变量都存储在DATA段中,g_iB是未初始化的全局变量存储在静态区BSS段中,iE、iF、iH都是局部变量存储在栈区;piG是局部变量存储在栈区,但其指向内存为手动开辟的堆区内存;
4.有关内存的思考题
void GetMemory(char *p)
{
p =(char *)malloc(100);
}
void Test(void)
{
char *str=NULL;
GetMemory(str);
strcpy(str,"hello world");
printf(str);
}
请问运行 Test 函数会有什么样的结果?
答:段错误
分析:str指针指向空,调用函数后手动为p指针开辟新空间,但函数调用结束时就释放了,所以str指针仍指向空,此时写入值会报段错误;
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是局部变量,函数调用结束时内存就会自动释放,此时返回的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);
}
请问运行 Test 函数会有什么样的结果?
答:hello world
分析:函数是地址传递,将p开辟的地址赋给了str指针,这样str指针就不是空指针,就可以进行字符串复制操作;
void Test (void)
{
char *str = (char *)malloc(100);
strcpy(str,"hello");
free(str);
if(str != NULL)
{
strcpy(str, "world");
printf(str);
}
}
请问运行 Test 函数会有什么样的结果?
答:段错误
分析:释放指针后未进行置空指针操作,此时指针成为野指针,指向未知地址;
5.堆和栈的区别是什么?
(1)管理分配效率不同,堆区空间的申请和释放需要手动操作,执行效率慢,栈区由计算机自动分配和释放内存,效率高;
(2)增长方向不同,堆区是高地址存储且不连续,栈区是低地址存储且连续;
6.什么是内存泄漏?面对内存泄漏和指针越界,你有哪些方法?
答:如果没有及时释放被动态分配内存,系统会一直被其占用资源,进而导致系统崩溃;
方法:①及时释放不再使用的内存②设置合理的变量作用域,减少内存不不合理利用;