关于林锐内存思考

笔试题 专栏收录该内容
9 篇文章 0 订阅
      首先声明:以下部分内容出自http://blog.csdn.net/mr_chenping/article/details/8735854
     林锐内存思考的题目在有关C语言的笔试题中也是屡次遇到,每次见到这样的题目,都是,嗯,这个我知道,但是拿起笔来又无从下手,写不出一个让自己满意的答案,所以有必要将代码敲到电脑上运行一下,这样更加直观。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

void GetMemory(char *p) {
    p = (char *)malloc(100);
    //查看p的地址
    printf("p = %p\n",*p);
}
void Test(void) {
    char *str = NULL;

    //查看str的地址
    printf("str = %p\n",str);

    GetMemory(str);

    //查看str的地址
    printf("str = %p\n",str);

    strcpy(str,"hello world");
    printf(str);
}

/*
以上两个函数运行结果是:
str = 00000000
p = 00570F38
str = 00000000

--------------------------------
Process exited after 2.672 seconds with return value 3221225477
请按任意键继续. . .

答:程序崩溃,因为GetMemory并不能传递动态内存,Test函数中的 str一直都是NULL,
strcpy(str, "hello world");将使程序崩溃
*/

char *GetMemory2(void) {
    char p[] = "hello world";
    return p;
//编译器给出的警告:
//[Warning] function returns address of local variable [-Wreturn-local-addr]
}
void Test2(void) {
    char *str = NULL;
    str = GetMemory2();
    printf(str);
}

/*
以上两个函数的运行结果:
諏杣鹒奰
--------------------------------
Process exited after 0.02811 seconds with return value 8
请按任意键继续. . .

答:可能是乱码 因为GetMemory返回的是指向栈内存的指针,该指针的地址
不是 NULL,但其原现的内容已经被清除,新内容不可知
*/


void GetMemory3(char **p, int num) {
    *p = (char *)malloc(num);
}
void Test3(void) {
    char *str = NULL;
    GetMemory3(&str, 100);
    strcpy(str, "hello");
    printf(str);
}

/*
以上两段代码的运行结果是:
hello
--------------------------------
Process exited after 0.008539 seconds with return value 5
请按任意键继续. . .

答: (1)能够输出hello (2)内存泄漏没有free
*/


void Test4(void) {
    char *str = (char *) malloc(100);
    strcpy(str,"hello");
    free(str);
    if(str != NULL) {
        strcpy(str, "world\n");
        printf(str);
    }
}
/*
函数的运行结果为:
world

--------------------------------
Process exited after 1.858 seconds with return value 3221225477
请按任意键继续. . .

答:篡改动态内存区的内容,后果难以预料,非常危险 因为free(str);之后
str成为野指针,if(str != NULL)语句的结果将不确定。
*/
int main(void) {

//	Test();
//	Test2();
//	Test3();
    Test4();
    return 0;    
}

  • 1
    点赞
  • 0
    评论
  • 2
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值