| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1155 人关注过本帖, 1 人收藏
标题:指针与内存
只看楼主 加入收藏
梦米奇
Rank: 1
等 级:新手上路
帖 子:8
专家分:2
注 册:2013-7-12
结帖率:50%
收藏(1)
已结贴  问题点数:5 回复次数:13 
指针与内存
#include <stdio.h>
#include "string.h"

int main()
{
    char *str=NULL;
    int *p=NULL;
    str=(char*)0xFA65;
    printf("%p   ", str);
    p=(int*)str;
    memcpy(p, "123", 3);
    printf("%d\n", *p);
    return 0;
}


这样为什么不可以给地址赋值???    有什么办法可以解决吗?
搜索更多相关主题的帖子: include return 
2013-07-17 23:53
love云彩
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:青藏高原
等 级:贵宾
威 望:53
帖 子:3663
专家分:11416
注 册:2012-11-17
收藏
得分:2 
帮你顶一下,呼叫版主来解决

思考赐予新生,时间在于定义
2013-07-17 23:57
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:2 
你觉得应该怎么思考?

授人以渔,不授人以鱼。
2013-07-18 00:04
梦米奇
Rank: 1
等 级:新手上路
帖 子:8
专家分:2
注 册:2013-7-12
收藏
得分:0 
我在想是不是因为地址没有分配内存才不能赋值的吗?
2013-07-18 00:35
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
以下是引用梦米奇在2013-7-18 00:35:31的发言:

我在想是不是因为地址没有分配内存才不能赋值的吗?

你首先想那个指针的地址指了哪里去。16位的地址码,你在16位机器和操作系统上运行?你确认机器上有这个地址、而且这个地址可供你读写访问?

授人以渔,不授人以鱼。
2013-07-18 00:41
love云彩
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:青藏高原
等 级:贵宾
威 望:53
帖 子:3663
专家分:11416
注 册:2012-11-17
收藏
得分:0 
以下是引用梦米奇在2013-7-17 23:53:02的发言:

#include  
#include "string.h"
 
int main()
{
    char *str=NULL;
    int *p=NULL;
    str=(char*)0xFA65;
    printf("%p   ", str);
    p=(int*)str;
    memcpy(p, "123", 3);
    printf("%d\n", *p);
    return 0;
}
 
 
这样为什么不可以给地址赋值???    有什么办法可以解决吗?
char *,指向的地址存储的是 char 类型的数据,那么int*自然是指向的地址存储的是int类型的数据,删掉那些误解的,免得误导了别人,我百度找了很多,不过答案不太满意,只是找了memcpy()的用法介绍http://hi.baidu.com/bing2liuliu/item/1f9f7210a9a709e05f53b188


[ 本帖最后由 love云彩 于 2013-7-18 01:35 编辑 ]

思考赐予新生,时间在于定义
2013-07-18 00:42
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
回复 6楼 love云彩
你对“强制类型转换”的理解错了。

授人以渔,不授人以鱼。
2013-07-18 00:45
love云彩
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:青藏高原
等 级:贵宾
威 望:53
帖 子:3663
专家分:11416
注 册:2012-11-17
收藏
得分:0 
回复 7楼 TonyDeng
何解?

思考赐予新生,时间在于定义
2013-07-18 00:48
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你看看malloc()的用法,char* p = (char*) malloc(10),这样是把malloc()申请的内存解释为是一块指向char类型的数组入口地址,即指针p是指向char类型的(与声明char*相符),是地址所指向的对象被理解成char,而不是把地址值0xfa65强制变换成字符型。“强制类型转换”是无法真的改变数据的类型的,它只是“欺骗”对方这个数据“现在被理解成这样”,但数据仍然是不变的,比如10个char的一块内存,你强制转换成int给某个指针,那么这个指针就认为现在指向了5个int(16位系统下),这个指针自我理解对方的数据而已,与数据自身无关。所以这其实并没有真的“转换”数据类型,“强制类型转换”这个译法是非常误导人的。

str = (char*) 0xfa65,只是把逻辑地址0xfa65处的数据让指针str理解成是指向了一个char类型数据,至于这个数据是否真的是char,是不管的——比如,它可能是某个double型数据的某个字节。这里,仍然没有向str指向处的地址赋值,它只是向指针赋了地址值,并且把这个指针解释成指向了char型数据。到后面,p = (int*) str又让指针p解释所指向的地址是int,然而在16位系统中,int是2char的,复制3个char(数组{'1','2','3'})到p所指向的地址中,第一个int被解释成内存数据为0x3132的整数,但这个内存映像到底被解释成怎样的整数,又与机器使用高头还是低头法则有关(0x31是整数的高位还是低位决定有不同的输出结果)。若在32位或64位系统下,整个程序的结果又与此不同。

试图解剖机器,本来是现代编程的大忌,不知道现在的学生和教科书怎么那么喜欢钻研这种问题,掌握了也不见得你是高手。爱这样深入细节的,就注定这个程序无法移植。

授人以渔,不授人以鱼。
2013-07-18 01:20
love云彩
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:青藏高原
等 级:贵宾
威 望:53
帖 子:3663
专家分:11416
注 册:2012-11-17
收藏
得分:0 
回复 9楼 TonyDeng
我就说怎么用强制转换解释不通,原来是这么回事,不过我在VS上调试了,编译通过,但是到了运行窗口的那个界面,一旦输出了str的地址值之后,就终止运行了,这应该是
memcpy()的用法错了吧,不然怎么没有输出p所指向的值

思考赐予新生,时间在于定义
2013-07-18 01:44
快速回复:指针与内存
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017259 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved