| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 687 人关注过本帖
标题:求教指针指向地址不能写的问题
只看楼主 加入收藏
zhizhiniuniu
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2011-3-22
收藏
 问题点数:0 回复次数:5 
求教指针指向地址不能写的问题
今天遇到一个小问题

定义字符型指针时,如果直接定义并赋值:
char *a="abcde";
那么在定义指针之后,如果改变指针所指向地址的值
*a=’m’;  
是错的,执行到这里的时候会报错,提示该地址不可写。

而如果定义一个字符型数组,再把指针指向这个数组:
char c[5]="abcde";
char *a;
a=c;
*a='m';
就能正常执行。

问题比较初级,希望高手不吝赐教!
2011-03-22 16:32
ansic
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:恍惚窈冥
等 级:城市猎人
帖 子:1543
专家分:5367
注 册:2011-2-15
收藏
得分:0 
char *a="abcde";
*a='m';
我这里没错, 你用的是全角的单引号吧!

善人者,不善人之师;不善人者,善人之资。不贵其师,不爱其资,虽智大迷。
2011-03-22 16:43
njkido
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
帖 子:224
专家分:1184
注 册:2011-3-8
收藏
得分:0 
char *a="abcde"; //a--常量

char c[5]="abcde";//check!!
char *a;//a--变量
2011-03-22 16:57
xiaomarn
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:5
帖 子:348
专家分:2026
注 册:2009-3-18
收藏
得分:0 
字符串都是定义在const段的,是可读不可写的。
当用char *a="abcde"; 时,只是简单的将一个指针指向它,你对指针的解除引用的写操作都是非法的;
当用char c[5]="abcde";时,是在堆栈中开辟了一个内存区,它是可读可写的,然后再将const段中的字符串复制过来,
最后用一个指针指向它(数组名?)。这时你可以对它写操作,但原来的字符串不会受影响。

  :     char a[]="hello ";

    mov    eax, DWORD PTR ??_C@_06PLNL@hello?5?$AA@    ;定义在const中,"hello ",复制过程
    mov    DWORD PTR _a$[ebp], eax
    mov    cx, WORD PTR ??_C@_06PLNL@hello?5?$AA@+4
    mov    WORD PTR _a$[ebp+4], cx
    mov    dl, BYTE PTR ??_C@_06PLNL@hello?5?$AA@+6
    mov    BYTE PTR _a$[ebp+6], dl

; 6    :     char* b="world!";

    mov    DWORD PTR _b$[ebp], OFFSET FLAT:??_C@_06CBLJ@world?$CB?$AA@ ; `string';定义在const中,"world!"
从汇编的角度就很清楚
2011-03-22 17:01
zhizhiniuniu
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2011-3-22
收藏
得分:0 
回复 4楼 xiaomarn
谢版主指点~
2011-04-02 11:31
hoodlum1980
Rank: 2
来 自:浙江大学
等 级:论坛游民
威 望:2
帖 子:289
专家分:23
注 册:2008-2-24
收藏
得分:0 
char *a="123456";
这时候的字符串是位于初始化节中的常量数据,那里的数据是生成的时候写死在PE文件中的。
系统加载那个节(也称为段,section)时它的属性决定了,你不能写它。

char a 【】 = “。。。”。
这个时候a位于栈上,所以可写。离开函数后,不需要释放,因为栈上的临时数据是对程序员“透明式”的自动维护的。

[ 本帖最后由 hoodlum1980 于 2011-4-2 17:59 编辑 ]

my tech blog: /hoodlum1980
2011-04-02 17:54
快速回复:求教指针指向地址不能写的问题
数据加载中...
 
   



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

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