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

  • 相关阅读:
    Java集合框架:Collections工具类
    百度编辑器多图上传返回图片绝对路径问题
    iOS开发中“此证书的签发者无效”的解决方式
    codeblocks如何watch指针
    codeblocks如何watch数组
    printf不支持%lf
    doxygen可以生成C/C++代码的文档(根据注释)
    codeblocks中右键源文件没有Rename选项?
    codeblocks中给GCC编译器加参数
    codeblocks设置当前行高亮
  • 原文地址:https://www.cnblogs.com/qiangupc/p/3150746.html
Copyright © 2011-2022 走看看