CFile::Read()函数的问题

来源:百度知道 编辑:UC知道 时间:2024/06/20 04:32:19
都知道这个函数的第一个参数是缓冲区 那么 缓冲区起码该够大吧? 但是我这样
char *pString=new char;
CString String;
files.Read(pString,9);
String=pString;
CDC *pDC=GetDC();
pDC->TextOutW(0,0,String,9);
一段代码 竟然可以正常的读取 这是为什么呢? 难道是像字符串指针一样? “指针指向读出来的字符串?” 而且 如果把pString指向一个char变量 也不能正确运行 单单new分配内存可以 这为什么呢? 还有 Read()函数内部是怎么把读出来的数据放到我们提供的缓冲区的呢? 是不是一个字符一个字符的拷贝? 那和字符串指针有什么区别? 那不用初始化的指针不也可以用了吗?
Read()函数内部是怎么把读出来的数据放到我们提供的缓冲区的呢? 是不是一个字符一个字符的拷贝? 那和字符串指针有什么区别? 那不用初始化的指针不也可以用了吗?

files.Read(pString,9);
Read只是向PString指向的地址的连续9个字节的空间内存储读到的数据,并不管你为这个指针分配了多少空间!

是可以读取字符的,而且在显示字符串时是以'\0'作为字符串结束标志的,同样也是不管这个char的指针分配了多大的空间,所以也是可以正常显示的。

但是,在一个程序中还有其他很多变量的,而其他变量的地址可能就会在pString指向的地址的后面,这样你在files.Read(pString,9);后,这些变量的内容就都改变了。所以再执行其他操作时就会发生很多未知错误。
而如果pString指向的地址的后面空间被一些系统程序使用的话,那么执行完Read操作后是会造成系统崩溃的。

类似的其他很多关于指针的操作都是这样的,所以在使用指针时要特别注意这些问题。否则出现了错误,也是很难找到为什么会出错的。

char * 就是 string

但是你用new char ,只分配了一字节空间,能成功运行,不代表他是正常的
Read()后,自动一直向高地址填充数据
你又声明了一个CString 指向了 pString的地址,也就是那个串的首地址
所以能正常输出,

是可以正常读取的 因为pString这个指针指向一个字符的地址后
Read讲这个文件的前九个字符赋给以这个字符为首地址的后面九个空间
因为不知道这后面八个内存块有没有用途 所以这样做这次可以 下次就不一定能成功勒
所以建议不要这么做
如果有兴趣 加我百度号 我们可以讨论
pengxuewanp