读文件写道char*会报错,写到char【】就可以,为什么?

int main()
{
    fstream a("newpack",ios::out|ios::binary|ios::in);
    a.write("abcdefghi",10);

    char* b=NULL;
    char c[20];
    a.seekp(0, ios::beg);

    /*a.read(b,10);*/


    a.read((char*)c,10);

    /*cout << b << endl;*/
    cout << c << endl;


    char *d=NULL;
    d =(char*) "abc";
    cout << d;

}
``注释两行报错,为什么,原理?

char* b只是指针,需要分配空间,你试试用b = new char[20];看看能不能读取,记得结尾释放空间,delete []b;

char* b=NULL;

char c[20];

a.seekp(0, ios::beg);

因为你b是NULL,要指向c才可以

char c[20];

char* b=&c[0];

a.seekp(0, ios::beg);

a.read(b,10);

当指针NULL的时候,就不能对它访问,否则会报内存无法读取的错误。

如果我的回答让你满意,请采纳下,谢谢

你好,a.read(b,10);这句话执行的时候,b 是空指针,没有内存空间的,故而报错。而char c[20];
这句话表示c是指针,且指向20 字节内存首地址,故而执行a.read((char*)c,10); 不会报错。

读在char *b里面的话,是要对b分配空间的,不然你使用的时候 它还是null
好像是realloc和malloc函数

有一个叫字符串常量的东西存在静态内存区
char * str1="abc";
char *str2="abc";
str1和str2是相等的;因为str1和str2都指向了静态内存区的字符串"abc"
但是char str3[4]="abc";
char str3[4]="abc";
str3和str4是不相等的,因为他们有自己的内存空间

也就是说你这里面的b是没有分配的内存的,
而d则是将静态内存区的字符串"abc"的地址赋给d了

d =(char*) "abc";

这个地方abc是常量,是不能修改的

char* b只是指针,需要分配空间

b指向c char*b=&c[]应该就可以了
注释推荐用//

分配空间后读取

b、d类型为指针,需要分配地址,而不能为N∪LL

char* b=NULL; 需要指向具体实际内容才能使用

char* b只是指针,需要分配空间,你试试用b = new char[20];看看能不能读取,记得结尾释放空间,delete []b;