QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 653|回复: 2

请教高手:程序错在哪里

[复制链接]
发表于 2003-11-5 18:07:38 | 显示全部楼层 |阅读模式
编译能通过
当输入的数值小于等于5时,输出的结果正确,都是a
当输入大于5时,输出就不对了,而且每次都是第五个元素出错,why?
[code:1]

/*****************************************************
  程序目的:看能不能通过键盘的输入来定义一个常量

          过程:用const定义一个常量
                  用这个常量作为一个字符数组的长度
                  读取键盘的输入,决定这个常量的值
                  然后给字符数组赋值,为简单起见,每个元素都是字符'a'
                  最后输出这个数组,查看结果
*****************************************************/

#include <stdio.h>
const int MAX;        /*定义一个名为MAX的常量*/
int main()
{
  char string[MAX];    /*将MAX作为一个字符数组的长度*/
  char line[100];
  int i;

  printf("Please input a number:");   /*提示输入一个整数,这个整数将赋给MAX*/
  fgets(line,sizeof(line),stdin);
  sscanf(line,"%d",&MAX);              /*给MAX赋值*/
  printf("the MAX is %d\n",MAX);    /*添加一行输出,查看赋值是否成功*/
  for(i=0;i<(MAX-1);i++)
     {
        string[i]='a';
        printf("%c\n",string[i]);
     }
   string[(MAX-1)]='\0';                /*给字符数组加一个结束的标志*/
   printf("the string is %s\n",string);   /*输出这个数组*/

  return(0);
}
[/code:1]
发表于 2003-11-5 20:12:08 | 显示全部楼层
const int MAX;        /*定义一个名为MAX的常量*/
int main()
{
  char string[MAX];  

以后就算给MAX赋值也不能改变string的大小的,C语言好像不支持这种方式把
回复

使用道具 举报

发表于 2003-11-6 09:53:37 | 显示全部楼层
你的定义方式是绝对错误
但是在我这里却发现一个很有趣的现象
1。在vc下对const和空数组的校验很严格 编译阶段就被ka了
2。但是在gcc下却无论填多少都不会死
调试发现 初始string地址0x....22 line为0x....58
对常量没有初始化要求 也不作写保护 程序中MAX被修改
在读入MAX值=50后 line的/n符放到了0x....61处
在对string的写入中 他默认的为空串分配了8个字节 中间的空区域不知为何未允许写入 然后越界到了line中后允许写入line里未写入的部分
而且如果写入1000之大也没有报告越界?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-9 10:29 , Processed in 0.052319 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表