DAY11:学习作业

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空间释放时,需要对指针指空

堆和栈的区别是什么?

答案:

从管理分配和效率上讲:栈是计算机统一分配空间和管理空间的,堆是手动分配和管理的,所以效率上说堆不如栈的效率高

从空间增长方向上讲:堆是向高地址增长的,栈是向低地址增长的

从空间连续性上讲:堆是零散的空间,栈是连续的空间,所以堆会产生空间碎片,而栈不会

什么是内存泄漏?面对内存泄漏和指针越界,你有哪些方法?

 答案:当我们手动分配空间的时候,需要手动释放,当我们没有释放时,这部分内存会一直占据内存资源,就会产生内存泄漏。

为了避免内存泄漏。我们需要在手动分配空间,并使用完成后,及时释放掉,为了避免分配空间的地址,我们需要避免直接对空间首地址进行操作,使用指针进行操作

为了避免指针越界。我们需要在定义指针时,对指针及时初始化,不随意使用函数返回的局部变量的指针,在使用完成后,及时对指针指空;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值