该程序检查给定的字符串是否按字母顺序排列,并且每次用户输入一个字符时我都会分配新的内存,但是如果我不分配该内存,它将正常工作意思是(如果我从下面的代码中删除了注释行)是错误还是某些内存技术,如果我不使用那条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);
}
答案 0 :(得分:0)
您正在程序的开头用malloc
分配1个字节。由于各种原因,malloc
实际上可以分配比您请求的更多的内存(例如,优化将来的重新分配)。另外,操作系统通常基于页面来保护内存,因此,只要您访问同一页面,就不会出现错误。
访问尚未显式分配的内存具有未定义的行为,即使您的程序似乎正常工作,也必须避免访问该内存。
对于您的程序,我猜错误是您在声明c
有一个char*
。
指针通常为4或8个字节长,而您只分配1个字节。如果将c
声明为char
,且大小为1个字节,则程序应该可以工作。
无论如何,当用sizeof
或malloc
分配内存时,使用realloc
更安全,因为变量的大小在不同的系统上会有所不同。例如,在32位系统上,指针通常为4B,而在64位系统上通常为8B。