| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 398 人关注过本帖
标题:操作未分配内存的字符串指针的奇怪结果
只看楼主 加入收藏
Rexfield
Rank: 6Rank: 6
来 自:幻想乡
等 级:侠之大者
威 望:1
帖 子:240
专家分:484
注 册:2010-7-28
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:3 
操作未分配内存的字符串指针的奇怪结果
程序代码:
#include <stdio.h>
#include <math.h>

int main()
{
    int i=0;
    char *n;
    n = "this is !";
    printf("%s\n", n);
    while (i < 10)
    {
        sprintf(n, "; call function %s : %d", "_mas", i);
        printf("%d:%p:%s:%d\n", i++, n, n, strlen(n));
    }
    return 0;
}

输出:
程序代码:
this is !
0:00407030:; call function _mas : 0:24
1:00407030::0
2:00407030::0
3:00407030::0
4:00407030::0
5:00407030::0
6:00407030::0
7:00407030::0
8:00407030::0
9:00407030::0

为什么第一次执行成功而后面却无法进行?
缓冲区的地址没变,那么谁覆盖了缓冲区?
搜索更多相关主题的帖子: 内存 字符串 
2011-08-03 22:11
学习小菜鸟
Rank: 2
等 级:论坛游民
帖 子:5
专家分:10
注 册:2011-8-3
收藏
得分:7 
看不懂,呵呵,运行错误strlen
error C2065: 'strlen' : undeclared identifier
Error executing cl.exe.
2011-08-03 22:35
voidx
Rank: 12Rank: 12Rank: 12
来 自:邯郸
等 级:火箭侠
帖 子:1250
专家分:3538
注 册:2011-4-7
收藏
得分:7 
楼主用的什么编译器,在什么操作系统运行这个程序?
char *n;
n = "this is !";

这样写不会有任何问题,因为这样的代码不管在编译时还是在运行时都不会对 n 所指向的内存区域进行修改,只是改变 n 的值,使它指向字符串常量 "this is !" 所在的地址。但是下面的 while 在尝试修改 n 所指向的内存区域的内容时程序将会执行未知的行为。一般来讲会发生段错误或者内存访问错误,可是看楼主的输出却是程序能够继续运行,这还是挺奇妙的
2011-08-03 23:29
Rexfield
Rank: 6Rank: 6
来 自:幻想乡
等 级:侠之大者
威 望:1
帖 子:240
专家分:484
注 册:2010-7-28
收藏
得分:0 
回复 3楼 voidx
cl.exe+winxp
如果在循环中加入
n = "this is ...";
printf("%s\n", n);

会更奇怪的

If you're not failing every now and again, it's a sign you're not doing anything very innovative.
2011-08-03 23:43
快速回复:操作未分配内存的字符串指针的奇怪结果
数据加载中...
 
   



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

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