Почему работает нормально без выделения памяти - PullRequest
0 голосов
/ 20 сентября 2018

Эта программа проверяет, находится ли данная строка в алфавитном порядке, и я выделяю новую память каждый раз, когда пользователь вводит символ, но работает нормально, если я не выделяю эту память. Средства (если я удаляю закомментированную строку из кода ниже) это ошибка или какая-то техника памяти, откуда берется память, если я не использую эту 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 голосов
/ 22 сентября 2018

Вы выделяете 1 байт с malloc в начале вашей программы.malloc может фактически выделить больше памяти, чем вы запрашиваете по различным причинам (например, оптимизировать будущие перераспределения).Кроме того, операционная система обычно защищает память на основе страниц, поэтому при обращении к одной и той же странице ошибки не возникают.Доступ к памяти, которую вы явно не распределили, имеет неопределенное поведение, и его следует избегать, даже если ваша программа, кажется, работает.

Что касается вашей программы, я предполагаю, что ошибка в том, что вы заявляете, что c имеетchar*.Указатель обычно имеет длину 4 или 8 байт, а вы выделяете всего 1 байт.Если вы объявите c как char, который имеет размер 1 байт, ваша программа должна работать.

В любом случае, безопаснее использовать sizeof при выделении памяти с помощью malloc или realloc, поскольку размер переменной может варьироваться в разных системах.Например, в 32-битной системе указатель обычно равен 4B, а в 64-битной системе обычно равен 8B.

...