在结构中使用字符数组还是字符指针?

在结构中使用字符数组还是字符指针?
我们都知道字符数组和字符指针都可以用来存储字符串,那么在结构中字符数组是否可以用字符指针代替呢?假如有两个struct的声明:
struct array{
 char str1[10];
 char str2[10];
} first;

struct point{
 char *str1;
 char *str2;
} second;
在vc6.0系统中,结构体struct array为变量first共分配20个字节(str1[10]与str2[10]各占10个字节)来存储字符串,即字符串是存储在结构体struct array内部。
结构体struct point为变量second共分配8个字节(str1与str2各占4个字节)来存储指向字符类型的地址,即字符串没有存储在struct point内部。
在对两个变量初始化时,例如:
struct array first={"first","second"};
struct point second={"first","second"};
在用printf()语句输出时,会发现此时字符数组和字符指针没有差别,都能够正常输出。
但是在程序运行过程中,如果要用scanf()语句来为结构体struct array变量first和结构体struct point变量second赋值时,会出现运行时的内存错误。例如:
scanf("%s",first.str1);
scanf("%s",second.str1);
这两条语句在编译时都不会报错,但在运行时,当执行到第二条语句时会出现内存错误。
因为在声明first变量时,系统就已经为first.str1分配了10个字节的内存来存储字符串,而在声明second变量时,系统为second.str1分配的仅是4个字节的内存地址,用来存放指向char型数据的地址,此时地址变量seconde.str1未经初始化,其内部存储的可能是任意地址值,所以当用scanf()语句把一个字符串存储在second.str1中时可能会引起未知的内存错误。在这种情况下,如果用字符指针来代替字符数组,显然是不行的。
但是事情没有绝对的,如果在使用字符指针来存储字符串之前,用malloc()函数为字符指针申请内存空间,那么使用字符指针和字符数组来存储字符串都是可以的,例如:
second.str1=(char *)malloc(sizeof(char*));
scanf("%s",second.str1);
这样编译和运行时都不会出现错误。使用完别忘了要用free()函数来释放分配给second.str1的内存空间,否则会引起的内存泄露的。

 


 

你可能感兴趣的:(C/C++,struct,存储)