zoukankan      html  css  js  c++  java
  • C语言内存分配相关练习

    1、输出结果:hello;

        因为局部指针变量p传给函数GetMemory之后,函数参数是指针的指针,这样就可以通过指针的特性,直接操作main函数中的局部指针变量,为其分配适当的内存空间

    void GetMemory(char** pt, int num) {
    *pt = (char*)malloc(100);
    }
    int main() {
    char *p = NULL;
    GetMemory(&p, 10);
    strcpy(p, "hello");
    printf(p);

    free(p);

    p = NULL;
    return 0;
    }

    2、

    (1)输出结果:hello;

    char *getMemory(void) {
    char *p = (char*)malloc(10);
    printf("p = %p ", p);     //这里输出的地址和mian函数中相同
    printf("s = %s ", p);      //这里输出乱码,因为并没有给它赋值
    return p;
    }
    int main(){
    char *p = NULL;
    p = getMemory();
    strcpy(p, "hello");
    printf("p = %p ", p);     //和getMemory分配的地址相同
    printf("s = %s ", p);      //输出hello
    return 0;
    }

    (2)输出结果:hello

    char *getMemory(void) {
    char *p = (char*)malloc(10);
    p = "hello";
    printf("p2 = %p ", p);      //这里两处输出和main函数中的相同
    printf("s2 = %s ", p);
    return p;
    }
    int _tmain(int argc, _TCHAR* argv[]){
    char *p = NULL;
    p = getMemory();
    printf("p2 = %p ", p);
    printf("s2 = %s ", p);
    return 0;
    }

    (3)没有输出结果,在运行时出现错误

    解析:getMemory中的形参是char *pt,当你传入一个char *p指针时,getMemory并没有真正操作p指针,而是操作其一个副本

    char *getMemory(char *pt) {
    pt = (char*)malloc(10);
    return pt;
    }
    int main(){
    char *p = NULL;
    getMemory(p);         

    printf("%p ",p);    //这里输出的是00000000,也就是指针仍旧为空,将上一句改为 p = getMemory(p); 就可以正常执行了
    strcpy(p, "hello");
    printf(p);
    return 0;
    }

    4、

    (1)如下代码,可以正确执行

    char *getMemory(void) {
    char *p1 = "hello";
    printf("p1 = %p ", p1);      //这里两处的输出和main函数中的相同
    printf("s1 = %s ", p1);
    return p1;
    }

    void main(void) {
    char *p1= NULL;
    p1 = getMemory();
    printf("p1 = %p ", p1);
    printf("s1 = %s ", p1);
    return;
    }

    (2)如下代码,最终在main函数中会输出不确定值

    char *getMemory(void) {
    char p1[] = "hello";
    printf("p1 = %p ", p1);    //输出一个内存地址
    printf("s1 = %s ", p1);    //输出hello
    return p1;
    }

    void main(void) {
    char *p1= NULL;
    p1 = getMemory();
    printf("p1 = %p ", p1);    //输出的内存地址和getMemory1的地址相同
    printf("s1 = %s ", p1);     //输出不确定值
    return;
    }

    解析:4(1)和4(2)中唯一不同的是,4(2)中getMemory返回的是局部char型数组的首地址,而4(1)中getMemory返回的是局部char*,所以说char型数组名和char型指针的效果是不同的,个人理解char型数组名的内存地址是固定的,不会再改变,但是char型指针可以随意改变指向的内存地址

    上面的截图就是4(2)运行效果图,执行环境是win7系统下的visual studio 2010

  • 相关阅读:
    NX二次开发-UFUN设置显示状态抑制显示UF_DISP_set_display
    NX二次开发-使用NXOPEN C++向导模板做二次开发
    ANTV/G6 怎么按条件自定义节点颜色(Graphin)
    js数组去重及数组对象去重
    vue组件老胡机抽奖(转载)
    Kafka第二节
    Kafka第一节
    更改idea的database数据库连接的ddl格式
    不推荐别的了,IDEA 自带的数据库工具就很牛逼!
    MongoDB 按照时间段查询某个物理机的CPU使用率,按照时间倒序排序,取出最新的5条数据
  • 原文地址:https://www.cnblogs.com/qiangupc/p/3150746.html
Copyright © 2011-2022 走看看