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

  • 相关阅读:
    Linux下vi的用法
    C++程序设计语言编程风格演变史(转载)
    软件项目经理必备素质(转)
    DES加密算法的实现
    世界编程大赛一等奖作品
    AStar算法的原理及应用
    一个DirectX使用的例子
    ConsolePlayer
    自制贪吃蛇游戏
    关于安装 DirectX SDk Dec 2005 后无法编译DirectShow应用程序的问题
  • 原文地址:https://www.cnblogs.com/qiangupc/p/3150746.html
Copyright © 2011-2022 走看看