char a[21];
memset(a,'1',4096);

char a[21];
memset(a,'1',4096);
char b[21];
strcpy(b,a);哪段代码会报内存超限,为啥?请各位达人解释一下!

解决方案 »

  1.   

    测试一下前者没问题,后者有问题。msdn上说:
    Security Note   Make sure that the destination buffer has enough room for at least count characters. 我建议不要这样写代码,象第一种那样的,不是没事找崩溃吗,让程序员自己保证有足够内存,否则可能产生的结果未知
      

  2.   

    char a[21];
    memset(a,'1',4096); 这里a的内存只有21个,如果你memset处理21位的内存已经被系统标记为使用状态就可能会出现内存访问错误。
      

  3.   

    如果是这样呢?
    char a[21]; 
    memset(a,'1',21); 
    和 
    char a[21]; 
    memset(a,'1',21); 
    char b[21]; 
    strcpy(b,a); 
      

  4.   

    字符串要以'\0'结束。
    char a[21];
    memset(a,'1',20);
    a[20] = '\0';
    char b[21];
    strcpy(b,a); 
     
      

  5.   

    如果
    void a(){
    char a[21]; 
    memset(a,'1',4096); 
    }void b(){
    char a[21]; 
    memset(a,'1',4096); 
    char b[21]; 
    strcpy(b,a); 
    }
    void main()
    {
    a();
    b();
    }
    你就会发现函数返回了0x00000001地址,调试器会报告错误,如果非调试状态下,系统会报内存访问无效.
      

  6.   

            try
            {
                    char a[21];
                    memset(a,'j',4096);
                    char b[21];
                    strcpy(b,a);
            }
            catch(Exception &E)
            {
                    MessageBox(Application->Handle,"Error","Err",MB_OK);
            }我用这样,却捕获不到异常,郁闷中……
      

  7.   


    严重破坏堆栈,这样整个函数都无法返回啦。
    捕捉异常用
    char c[4096];
            try 
            { 
                    char a[21]; 
                    memset(a,'j',4096); 
                    char b[21]; 
                    strcpy(b,a); 
            } 
            catch(...) 
            { 
                    MessageBox(Application->Handle,"Error","Err",MB_OK); 
            } 
      

  8.   

    如果a[21] ,而你又memset(a,'b'21);的话
    编译都可通过,但是你在读取时 字符串没有结束符
    会造成读取出错,程序不知道字符串哪里结束,造成内存越界
      

  9.   

    char c[4096]; 
            try 
            { 
                    char a[21]; 
                    memset(a,'j',4096); 
                    char b[21]; 
                    strcpy(b,a); 
            } 
            catch(...) 
            { 
                    MessageBox(Application->Handle,"Error","Err",MB_OK); 
            } 这个好像同样没用撒,
    不知如何才能捕获到这个异常?
      

  10.   

    已经破坏了其他的内存,但是Debug/Release下有不同的内存布局,所以可以试下看Release版,看看会不会报错了
      

  11.   

    这个问题比较严重,而且问题发生很随机,我曾经碰到过一个类似问题,让我找了3天才找出原因,就是用的别人的代码里,分配的数组空间没有给/0保留一位,所以在读取的时候,没有/0,程序指针就乱了,所以是随机发生的。
    你上面的情况是,
    char a[21]; 
    memset(a,'1',4096); //这里为什么要4096??这个把其他内存空间的内容也给设置为1了,那个空间存的是什么是未知的。