【问题标题】:Why it works fine without allocating memory为什么它在不分配内存的情况下工作正常
【发布时间】:2019-02-24 16:04:43
【问题描述】:

这个程序检查给定的字符串是否按字母顺序排列,并且每次用户输入一个字符时我都会分配新的内存,但如果我不分配该内存意味着它工作正常(如果我从下面的代码中删除注释行) 如果我不使用 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 应该是char,而不是char*
  • 您还应该在 malloc/realloc 中使用 sizeof(char),而不是 1。它在大多数情况下不会产生影响,但更具可读性并且代码更具可移植性。
  • amendo 我想我每次都需要额外的时间来计算大小,但我的问题是 -> 如果我删除 realloc 行,代码可以正常工作,这是为什么呢?

标签: c++ memory memory-management heap-memory


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2016-11-06
    • 2011-04-19
    • 1970-01-01
    • 2017-05-30
    • 2014-05-31
    • 1970-01-01
    • 2017-09-23
    • 2020-03-07
    • 1970-01-01
    相关资源
    最近更新 更多