为什么它可以正常工作而不分配内存

时间:2018-09-20 10:54:50

标签: c memory memory-management heap-memory

该程序检查给定的字符串是否按字母顺序排列,并且每次用户输入一个字符时我都会分配新的内存,但是如果我不分配该内存,它将正常工作意思是(如果我从下面的代码中删除了注释行)是错误还是某些内存技术,如果我不使用那条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);
}

1 个答案:

答案 0 :(得分:0)

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

对于您的程序,我猜错误是您在声明c有一个char*。 指针通常为4或8个字节长,而您只分配1个字节。如果将c声明为char,且大小为1个字节,则程序应该可以工作。

无论如何,当用sizeofmalloc分配内存时,使用realloc更安全,因为变量的大小在不同的系统上会有所不同。例如,在32位系统上,指针通常为4B,而在64位系统上通常为8B。