p 和 "hello,world"存储在内存哪个区域?( )
int main(){
char *p = "hello,world";
return 0;
}
答案:栈区
分析:内存分为内核、栈区、共享映射区、堆区、静态区全局区,内核是放命令行参数得,栈区是放局部参数,包括const局部变量、复合语句、函数参数,堆区是手动开辟空间、包括malloc和free,静态区和全局区分配四个段:.bss、.data、.ro、.text,bss是放未初始化的全局变量和static变量,data是初始化好的全局变量和static变量,ro是const常量、宏定义、字符串常量,text是放代码段的
一个由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段中;
分析:内存分为内核、栈区、共享映射区、堆区、静态区全局区,内核是放命令行参数得,栈区是放局部参数,包括const局部变量、复合语句、函数参数,堆区是手动开辟空间、包括malloc和free,静态区和全局区分配四个段:.bss、.data、.ro、.text,bss是放未初始化的全局变量和static变量,data是初始化好的全局变量和static变量,ro是const常量、宏定义、字符串常量,text是放代码段的
如下代码:变量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:.data ;g_iB:.bss;g_iC:.data;iD:.data;iE:栈区; iF:栈区; piG:栈区;iH:栈区
分析:g_iA:初始化的全局变量;g_iB:未初始化的全局变量;g_iC:初始化的静态变量;iD:初始化的静态变量;iE:局部变量; iF:局部变量; piG:局部变量;iH:局部变量;
有关内存的思考题
void GetMemory(char *p){
p =(char *)malloc(100);
}
void Test(void){
char *str=NULL;
GetMemory(str);
strcpy(str,"hello world");
printf(str);
}
请问运行 Test 函数会有什么样的结果?
答案:段错误、内存泄漏、内存越界
分析:调用Getmory,分配的内存是分配给形参的,而不是实参,所以在函数调用完成后,会将内存回收,所以没有分配成功,但没有手动free空间会导致内存泄漏,在没有分配空间的情况下,strcpy会访问到非法内存,会导致内存越界
char * GetMemory(void){
char pl[] = "hello world"; //char *p = "hello world"
return p1;
}
Void Test(void){
char *str=NULL;
str = GetMemory();
printf(str);
}
请问运行 Test 函数会有什么样的结果?
答案:无输出
分析:在函数中创建的字符串数组,在函数运行完成后会被清空,所以其返回值是空,所以当输出是无结果
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
分析:函数输入的是指针str的地址,当对其值进行修改时,可以成功修改其值
void Test (void){
char *str = (char *)malloc(100);
strcpy(str,"hello");
free(str);
if(str != NULL){
strcpy(str, "world");
printf(str);
}
}
请问运行 Test 函数会有什么样的结果?
答案:输出world
分析:当分配空间的时候,分配的是堆空间,当对malloc进行free空间释放,指针仍然是指向堆空间的,所以我们仍然可以对其赋值,所以当我们进行free空间释放时,需要对指针指空
堆和栈的区别是什么?
答案:
从管理分配和效率上讲:栈是计算机统一分配空间和管理空间的,堆是手动分配和管理的,所以效率上说堆不如栈的效率高
从空间增长方向上讲:堆是向高地址增长的,栈是向低地址增长的
从空间连续性上讲:堆是零散的空间,栈是连续的空间,所以堆会产生空间碎片,而栈不会
什么是内存泄漏?面对内存泄漏和指针越界,你有哪些方法?
答案:当我们手动分配空间的时候,需要手动释放,当我们没有释放时,这部分内存会一直占据内存资源,就会产生内存泄漏。
为了避免内存泄漏。我们需要在手动分配空间,并使用完成后,及时释放掉,为了避免分配空间的地址,我们需要避免直接对空间首地址进行操作,使用指针进行操作
为了避免指针越界。我们需要在定义指针时,对指针及时初始化,不随意使用函数返回的局部变量的指针,在使用完成后,及时对指针指空;