为什么没有分配内存就可以正常工作

问题描述 投票:0回答:1

这个程序检查给定的字符串是否按字母顺序排列,每次用户输入一个字符时我都会分配新的内存,但是如果我不分配那个内存它工作正常意味着(如果我从下面的代码中删除注释行)是它一个错误或一些记忆技术,如果我不使用那个realloc()线,它从哪里得到记忆

#include<iostream>
#include<conio.h>
#include<stdlib.h>
bool Alphabetical(char DA[],unsigned short n)
{
    for(n ;n>-1;n--)
       if(n==0)                                                      return true;
       else if((DA[n]<91&&DA[n-1]<91)&&(DA[n]<DA[n-1]))              return false;
       else if((DA[n]>96&&DA[n-1]>96)&&(DA[n]<DA[n-1]))              return false;
       else if((DA[n]<91&&DA[n-1]>96)&&(DA[n]+=32)&&(DA[n]<DA[n-1])) return false;
       else if((DA[n]>96&&DA[n-1]<91)&&(DA[n]-=32)&&(DA[n]<DA[n-1])) return false;
       return true;
}
int main()
{
    int block=1,i=-1;
    char *DA=(char*)malloc(1*block),c;
    std::cout<<"Enter a string(ONLY ALPHEBATS,ANY LENGTH)\n";
    while((c=getche())!=13)
          if(c>64&&c<91||c>96&&c<123)
         {
           DA[++i]=c;
           realloc(DA,1*(++block));/// i din't understand why is it working fine without this line
         }
       else    std::cout<<"\b \b";
       std::cout<<"\nreturned "<<Alphabetical(DA,i);
}
c memory memory-management heap-memory
1个回答
0
投票

您在程序开头用malloc分配1个字节。由于各种原因,malloc实际上可以分配比您请求的内存更多的内存(例如,优化未来的重新分配)。此外,操作系统通常基于页面保护内存,因此只要您访问同一页面,就不会产生错误。访问未明确分配的内存具有未定义的行为,必须避免,即使您的程序似乎有效。

至于你的程序,我猜错误是你宣布c有一个char*。指针通常为4或8个字节长,而您只分配1个字节。如果你将c声明为char,其大小为1字节,那么你的程序应该可行。

无论如何,当你用sizeofor malloc分配内存时使用realloc更安全,因为变量的大小可能因系统而异。作为32位系统的一个例子,指针通常是4B,而在64位系统上通常是8B。

© www.soinside.com 2019 - 2024. All rights reserved.