内存操作

来源:互联网 发布:怀化网络管理招聘 编辑:程序博客网 时间:2024/05/22 00:48

1. main()

    {

          int a [5] = {1, 2,3,4,5};

        int *ptr = (int *)(&a+1);

        printf("%d,%d", *(a+1), *(ptr - 1));

    }

    输出结果是什么?

    答案:输出:2, 5

    *(a+1)是a[1],

    *(ptr -1)就是a[4],

    执行结果是2, 5

   &a+1不是首地址+1, 系统会认为加一个a数组的偏移, 是偏移了一个数组的大小(本例是5个int

   int *ptr = (int *)(&a+1);

   则ptr实际上是&(a[5]),也就是a+5

原因如下:

&a 是数组指针, 其类型为int (*)[5];

而指针加1要根据指针类型加上一定的值, 不同类型的指针+1之后增加的大小不同。

a 是长度为5的int数组指针,所以要加5*sizeof(int)

所以,ptr实际是ptr[5]

但是ptr与(&a+1)类型时不一样的(这点很重要)

所以ptr-1只会减去sizeof(int *)

a, &a的地址是一样的,但是意思不一样

a是数组首地址,也就是a[0]的地址,&a是对象(数组)首地址

a+1是数组下一元素的地址,即a[1], &a+1是下一个对象的地址,即a[5].

2. #include <stdio.h>

#include <stclib.h>

void getmemory(char * p)

{

     p = (char *)malloc(100);

   strcpy(p, "hello");

}

int main()

{

char *str = NULL;

getmemory(str);

printf("%s\n", str);

free(str);

return 0;

}

分析一下这段代码

答案:程序崩溃,getmemory 中的malloc不能返回动态内存,free()对str操作很危险

getmemory中p是形参,是一个指针变量,getmemory(str)调用后,传入的是指针变量保存的对象地址,

p=(char*)malloc(100)实际上是把申请的动态内存空间的首地址付p指向的地址(即str指向的地址null),

这是错误的。应该修改成指向指针的指针void getmemory(char **p),

这样malloc返回的地址付给*p(即str 变量本身)

 
修改后

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *getmemory(char *p, int num)
{
        return (p = malloc(num));

}

int main(void)
{

        char *str = NULL;
        str = getmemory(str, 100);
        strcpy(str, "hello world");
        printf(str);
        free(str);
        return 0;

}

原创粉丝点击