关于char *a动态内存分配的有关问题
关于char *a动态内存分配的问题
为什么
可以正常输出 我没有定义a的大小
而底下的例子
如果我不加
b = new char [strlen(a)+1];
就会报错?
------解决方案--------------------
第一个是因为a有指向了,也就有了内存空间里,所有有结果。如果换成*a="jack",那就报错。。。
第二个是因为你定义一个b指针,没有指向,没有内存空间,是野指针
------解决方案--------------------
strcpy是将第二个参数里的字符串复制到第一个参数里,前提是第一个参数指向的空间足够存放。char *b仅仅只是一个指针,它并没有指向任何地址,当然也没有空间去存放了。
------解决方案--------------------
做a做a, 有a当然能做
操b操b,没有牛(new),b在那里呢?
------解决方案--------------------
这个看存储位置,你直接使用“Jack”,那么他是存储在常量区,不可修改。你是用指针赋值给他,表示这个指针指向的地址是这个常量字符串的地址。如果你只声明指针,那么你必须使用new来在堆上分配内存,以存储字符串,不然,字符串应该放在哪里呢?
------解决方案--------------------
///////////////////////////////////////////////////
楼主,我给你分析:
首先,你要知道
char *a; //你这写,只是定义了一个指向char的指针,a本身只占用4个字节,通常这样是表示一个地址,你可以把任意一个字符串的地址赋值给a;如果你要添加大小,如 char *a[5],这样定义后,说明了,数组中每一个元素都是指向char的指针,说明a[1]到a[5]都是指向字符的指针,当然每个数组元素都可以指向一个字符串的首地址,如:
a[1]="abcde',此时不是说明a能存放abcde",只是说明你把内存空间中的字符常量区的'abcde'的地址,赋值给了a[1],
如果你使用printf("%s",a[1]),他的输出结果是abcde;
a="jack" //这个上面已经讲到,这个不是说明a可以存放"jack"(因为在32位系统下jack只占四个字节),只是说明‘jack"把它的地址给了a;
char *b;//这个定义上面已经解释过了,不懂的话看char *a的定义
void test(char *a) //这个char *a参数传递进来,一看下面的操作,你应该是想把参数指向的字符串的内容复制给下面的b指向的内存;
{
b = new char [strlen(a)+1]; //这个是在堆中分配一定的空间,然后将这段分配的内存空间的首地址给b;
strcpy(b, a); //这里strcpy做的操作时a指向的字符串内容复制到b指向的内存空间中。
//说到这里,你已经明白出错的原因了吧;
//你如果不用malloc分配空间的话,strcpy复制给b的时候,b是野指针,没有指向任何内存空间,所以它会报错。。
cout<<b;
}
最后,给你普及个知识:
1.用char *a="abc' ,这样的操作不是将abc的字符串的内容复制到a,而是将"abc"的首地址给a,可以这样说,这样写是地址赋值
2.strcpy(a,b)这样的写法是是将b指向的字符串内容复制到a地址指向的字符串,这个操作时真正的复制字符串内容的操作。。
为什么
char *a;
a="jack"
cout<<a;
可以正常输出 我没有定义a的大小
而底下的例子
char *b;
void test(char *a)
{
b = new char [strlen(a)+1];
strcpy(b, a);
cout<<b;
}
如果我不加
b = new char [strlen(a)+1];
就会报错?
------解决方案--------------------
第一个是因为a有指向了,也就有了内存空间里,所有有结果。如果换成*a="jack",那就报错。。。
第二个是因为你定义一个b指针,没有指向,没有内存空间,是野指针
------解决方案--------------------
char *a;
a="jack" //被警告的代码,不能从常量字符串转换到char *
cout<<a;
strcpy是将第二个参数里的字符串复制到第一个参数里,前提是第一个参数指向的空间足够存放。char *b仅仅只是一个指针,它并没有指向任何地址,当然也没有空间去存放了。
------解决方案--------------------
做a做a, 有a当然能做
操b操b,没有牛(new),b在那里呢?
------解决方案--------------------
这个看存储位置,你直接使用“Jack”,那么他是存储在常量区,不可修改。你是用指针赋值给他,表示这个指针指向的地址是这个常量字符串的地址。如果你只声明指针,那么你必须使用new来在堆上分配内存,以存储字符串,不然,字符串应该放在哪里呢?
------解决方案--------------------
///////////////////////////////////////////////////
楼主,我给你分析:
首先,你要知道
char *a; //你这写,只是定义了一个指向char的指针,a本身只占用4个字节,通常这样是表示一个地址,你可以把任意一个字符串的地址赋值给a;如果你要添加大小,如 char *a[5],这样定义后,说明了,数组中每一个元素都是指向char的指针,说明a[1]到a[5]都是指向字符的指针,当然每个数组元素都可以指向一个字符串的首地址,如:
a[1]="abcde',此时不是说明a能存放abcde",只是说明你把内存空间中的字符常量区的'abcde'的地址,赋值给了a[1],
如果你使用printf("%s",a[1]),他的输出结果是abcde;
a="jack" //这个上面已经讲到,这个不是说明a可以存放"jack"(因为在32位系统下jack只占四个字节),只是说明‘jack"把它的地址给了a;
char *b;//这个定义上面已经解释过了,不懂的话看char *a的定义
void test(char *a) //这个char *a参数传递进来,一看下面的操作,你应该是想把参数指向的字符串的内容复制给下面的b指向的内存;
{
b = new char [strlen(a)+1]; //这个是在堆中分配一定的空间,然后将这段分配的内存空间的首地址给b;
strcpy(b, a); //这里strcpy做的操作时a指向的字符串内容复制到b指向的内存空间中。
//说到这里,你已经明白出错的原因了吧;
//你如果不用malloc分配空间的话,strcpy复制给b的时候,b是野指针,没有指向任何内存空间,所以它会报错。。
cout<<b;
}
最后,给你普及个知识:
1.用char *a="abc' ,这样的操作不是将abc的字符串的内容复制到a,而是将"abc"的首地址给a,可以这样说,这样写是地址赋值
2.strcpy(a,b)这样的写法是是将b指向的字符串内容复制到a地址指向的字符串,这个操作时真正的复制字符串内容的操作。。