| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2103 人关注过本帖
标题:关于 char * 指针数组的问题
只看楼主 加入收藏
Jonny0201
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:52
帖 子:488
专家分:2603
注 册:2016-11-7
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:5 
关于 char * 指针数组的问题
程序代码:
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
    char *arr = (char *)malloc(sizeof(char) * 2);
    for(int i = 0; i < 10; i++) {
        arr[i] = 65 + i;
    }
    printf("%s", arr);
}


问题是在写堆串的时候突然发现的,之前从来没注意过,也没有特意去越界
第一句明明只是赋予了 char *arr 2 个空间
然而实际插入了不止是 2 个,而是 10 个,但是居然能够成功输出 ABCDEFGHIJ
把 char 换成了 int, 也可以成功输出
图片附件: 游客没有浏览图片的权限,请 登录注册

这样做明显占用了本不应该是自己的空间,但是为什么没有报出数组越界的错误,而是可以成功通过编译
另外,实际编程中,是否支持这样去做?也就是说本来应该 int *a = new int[10],实际上只需要 int *a = new int 就可以了(申请空间用 C++ 的 new 暂时代替)

之后我在想是否可以通过 char ** 不限制空间去模拟一个简单 vim,但是 char ** 的第一个指针如果越界是会报错的

有没有大神解释一下原理
搜索更多相关主题的帖子: char 指针 数组 int 空间 
2018-02-03 20:07
lulipro
Rank: 2
等 级:论坛游民
威 望:1
帖 子:11
专家分:60
注 册:2016-4-5
收藏
得分:20 
这样做当然是不可以的。必须遵守:需要多少,就申请多少,申请多少,就只能使用多少。
之所以不会报错,这就是C语言的“自由”和“不安全”的体现。
C语言在设计哲学就是充分信赖程序员,也就是说程序的正确性和安全性几乎全部需要程序员自己保证,C标准不要求编译器做一些安全检查,比如数组越界。
C语言编译时,不检查数组越界错误。但是这不代表程序没有问题,这些越界问题很可能在程序运行的某时刻出现,导致程序运行崩溃。

C语言不安全的例子,和Java对比
程序代码:
if(a=1) //在C中不报错,而在Java中则会报错,因为Java设计理念就是确保程序的“安全性”。
{
   
}



总之,很多代码需要你自己明确:可不可以这样做,而不是让编译器去提醒你,可不可以这样做。
收到的鲜花
  • 炎天2018-02-03 22:48 送鲜花  10朵   附言:我很赞同
2018-02-03 22:15
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10537
专家分:42927
注 册:2014-5-20
收藏
得分:0 
指针可以指东指西,但不一定可以随便读写。
2018-02-04 07:03
kin3z
Rank: 5Rank: 5
等 级:职业侠客
威 望:4
帖 子:157
专家分:390
注 册:2011-4-24
收藏
得分:0 
别说指针 ,就算数组 ,也可以越界。。。
C资料可以查阅数组的知识,一般一开始就说你听C是对数组越界不做检测的,靠使用者自己来控制不越界。
我做了以下实验:
程序代码:
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv){
    int i = 0 ;
    char *a =(char *)malloc(sizeof(char));
    while(a){
        printf("%d : %p = %d\n",i,a,*a);
        a++;
        i++;
    }
    return 0;
}



我的电脑显示为:
。。。。
。。。。
135147 : 0x24fcffb = 0
135148 : 0x24fcffc = 0
135149 : 0x24fcffd = 0
135150 : 0x24fcffe = 0
135151 : 0x24fcfff = 0
Segmentation fault (core dumped)


[此贴子已经被作者于2018-2-4 14:28编辑过]

2018-02-04 14:18
Jonny0201
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:52
帖 子:488
专家分:2603
注 册:2016-11-7
收藏
得分:0 
回复 2楼 lulipro
看来很多基础知识还是需要夯实的
2018-02-04 19:18
tt138
Rank: 2
等 级:论坛游民
威 望:1
帖 子:16
专家分:17
注 册:2019-4-19
收藏
得分:0 
回复 楼主 Jonny0201

你搞的abcdefg是字符常量,这个你用int换掉char是宽换窄,当然没问题,c/c++严禁的是缩窄,如果你用char换int看编译器让你通过不?



[此贴子已经被作者于2019-4-23 13:19编辑过]

2019-04-22 22:23
快速回复:关于 char * 指针数组的问题
数据加载中...
 
   



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

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