内存操作
来源:互联网 发布:怀化网络管理招聘 编辑:程序博客网 时间: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;
}
- 内存操作
- 内存操作
- 内存操作
- 内存操作
- 内存操作
- 内存操作
- 内存操作
- 内存操作
- 内存操作
- 内存操作
- 内存操作
- 内存操作
- 字符串操作&内存操作
- I/O内存内存操作
- (转)内存操作
- vb操作内存
- C++内存分配操作
- 共享内存操作类
- Package: gnome-common (2.12.0-2)
- 使用LibTiff处理TIFF文件
- 一个不错的 trace.h 文件
- in与exist , not in与not exist 的区别
- linux常用命令
- 内存操作
- 互联网企业做手机吃“软”饭:靠应用服务谋利
- swc的外部代码引用问题
- centos 6.2 64位上安装ceph 0.47.2
- Nginx造成后端服务器大量TIME_WAIT的解决办法
- Maven入门实战
- IOS程序文档目录在模拟器中的地址(Unix操作)
- android 项目底层请求与下载(框)
- android 加载图片轻松避免OOM(out of memory) 支持设置缓存大小,不再强制catch OOM