| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2261 人关注过本帖
标题:[求助]使用strcpy函数时出现内存不能为读的问题~~
只看楼主 加入收藏
小子也大叔
Rank: 2
等 级:新手上路
威 望:4
帖 子:143
专家分:0
注 册:2007-4-23
收藏
得分:0 
补充下   忘了写 数组名就代表数组的首地址 

还有就是 printf("%s",&a);

try 下...

希望一心想学c的加我的群吧~~ 40834003
2007-05-30 00:23
百年不亮
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:789
专家分:0
注 册:2006-4-14
收藏
得分:0 
a[10]的值是未知的,把其中存储的值赋给指针,正好指向了不属于改进程的空间,printf要访问这个内存段,系统捕获了这种错误并终止该进程
乱用指针很可能让不够健壮的系统崩溃的
这就是为什么nt的内核要比之前的稳定的一个重要原因
2007-05-30 00:58
小子也大叔
Rank: 2
等 级:新手上路
威 望:4
帖 子:143
专家分:0
注 册:2007-4-23
收藏
得分:0 
以下是引用百年不亮在2007-5-30 0:58:09的发言:
a[10]的值是未知的,把其中存储的值赋给指针,正好指向了不属于改进程的空间,printf要访问这个内存段,系统捕获了这种错误并终止该进程
乱用指针很可能让不够健壮的系统崩溃的
这就是为什么nt的内核要比之前的稳定的一个重要原因

请问下这和windows NT内核的稳定有什么关系吗?不懂 LS的能讲下吗?


希望一心想学c的加我的群吧~~ 40834003
2007-05-30 07:28
crz03128
Rank: 1
等 级:新手上路
帖 子:83
专家分:0
注 册:2007-5-22
收藏
得分:0 
[QUOTE][/QUOTE]a[10]的值是未知的,把其中存储的值赋给指针,正好指向了不属于改进程的空间,printf要访问这个内存段,系统捕获了这种错误并终止该进程
乱用指针很可能让不够健壮的系统崩溃的
这就是为什么nt的内核要比之前的稳定的一个重要原因


原来如此,看来有点明白了了,等会再调试看看怎么样
字符串的输入输出果然和前面学的有点不一样
书本上对这些又说明的很少

老师领进门,成长靠自己+虚心
2007-05-30 12:47
小子也大叔
Rank: 2
等 级:新手上路
威 望:4
帖 子:143
专家分:0
注 册:2007-4-23
收藏
得分:0 
书本上学的东西毕竟是有限的  还是经常来论坛哦  呵呵~~~~~~~~~~

希望一心想学c的加我的群吧~~ 40834003
2007-05-30 13:55
百年不亮
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:789
专家分:0
注 册:2006-4-14
收藏
得分:0 
回“小子也大叔”:
winNT系统加强了进程内存管理,把每个进程的虚拟4G空间分为两大部份,低2G归用户所有,高2G归系统所有。用户不得访问系统的空间,连读都不行,更别说写了,自然可以避免应用程序乱用指针修改内存。想想你随便用个指针就改写了系统内核,这种系统是不是一天可能崩溃N次,蓝屏大家都见过吧。


在回楼主:
你还没有搞懂怎样输出一个字符串。用printf()输出int,char,float等类型时都是把要输出的值传给printf(),比如int a;printf("%d",a);在输出字符串时情况就不一样了,要把字符串的首地址给printf(),当printf读到"%s"时它就会把你给它的值当作字符串的首地址,然后访问那段内存,a[10]中可能放着一个比较大的数如0x10000000,即a[10]==0x10000000,printf把0x10000000理解为内存地址去访问,正好访问到了系统不允许它 read的内存。输出字符串的正确方法是printf("%s",&a[0]);&a[0]就是首元素地址嘛,不过没有这么麻烦,因为c 中定义数组名代表首元素地址,所以可以简单写为printf("%s",a),因为a==&a[0]

如果说你的书上没有讲怎样输出一个字符串,那你赶紧把那本书塞到垃圾桶中,如果讲了,想想你为什么不知道.

楼主这个阶段的还是认真看书,少来网上泡.
2007-05-30 14:29
夜中梦
Rank: 1
等 级:新手上路
帖 子:132
专家分:0
注 册:2007-5-12
收藏
得分:0 
以下是引用小子也大叔在2007-5-30 0:20:09的发言:
这个是LZ的程序:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(void)
{
char a[10]="HOLLAND";
char b[]="CHINA";
strcpy(a,b);
printf("%s",a[10]);

system("pause");
return 0;
}

LZ的问题就是象大家说的那样--当用%s输出字符串的时候 需要告知地址 及如:&a[10](暂且不说对不对) 

你们可以把上面那个printf语句写出很多种形式
下面是我改的:

printf("%s",a);
printf("%s",&a[0]);
printf("%s",&a[1]);前面两个我看的懂是对的,为什么后面的也是对的啊&a[4],&a[10]也能代表整个数组吗?
printf("%s",&a[4]);
printf("%c",&a[0]);
printf("%c",&a[4]);
printf("%s",&a[10]);
printf("%c",&a[10]);

大家自己运行看看吧   不懂可以上来问...


2007-05-30 15:26
neverTheSame
Rank: 3Rank: 3
来 自:江西农业大学
等 级:新手上路
威 望:9
帖 子:1511
专家分:0
注 册:2006-11-24
收藏
得分:0 
以下是引用小子也大叔在2007-5-30 0:23:13的发言:
补充下   忘了写 数组名就代表数组的首地址 

还有就是 printf("%s",&a);

try 下...

printf("%s",&a); 这是什么意思?
a一个指针,&a也就是指向a的指针了.


wap酷禾网(http://wap.),提供免费的、优质的、快捷的wap资源下载服务。
2007-05-30 18:54
wshyj18
Rank: 1
等 级:新手上路
帖 子:124
专家分:0
注 册:2007-5-14
收藏
得分:0 
#include<stdio.h>
#include<string.h>
void main()
{
char a[10]="HOLLAND";
char b[]="CHINA";
strcpy(a,b);
printf("%s",a[10]);
}听说倒数第二行的a[10]前可以用&,能告诉为什么吗
问题补充:将倒数第二的a[10]改为&a[10]是china
&a[9]是空
8是空
7是空
6是d
5是空
4是a
3是na
2中ina

1是hina
0是china

2007-06-01 12:35
小子也大叔
Rank: 2
等 级:新手上路
威 望:4
帖 子:143
专家分:0
注 册:2007-4-23
收藏
得分:0 
回复:(夜中梦)以下是引用小子也大叔在2007-5-30 0:...
要是你能看的懂 printf("%s",&a[1]); 就应该可以看的懂 你问的那两个

printf("%s",&..); 这个函数 不是说一定要 printf("%s",你定义的数组的首地址); 
而是你给它一个地址  然后它会从这个地址开始顺序的读取后面的内存 当遇到\0就结束 

这样你就知道 printf("%s",&a[4]);的结果咯  A

printf("%s",&a[10]); 这个呢  由于它已经越界  又由于后面内存中的值又是一些不确定的值 所以呢 输出的值就会是不确定的

不知道我说的对不对呢~~~~

希望一心想学c的加我的群吧~~ 40834003
2007-06-01 15:57
快速回复:[求助]使用strcpy函数时出现内存不能为读的问题~~
数据加载中...
 
   



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

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