下面的例子定義了兩個結構,由於成員中存在字符串,所以結構一使用了字符數組,而結構二使用字符指針。
#include <stdio.h>
#define LEN 20
struct info {
char first[LEN];
char last[LEN];
int age;
};
struct pinfo {
char * first;
char * last;
int age;
};
int main()
{
struct info one = {"Opw", "Cde", 22};
struct pinfo two = {"Tydu", "Gqa", 33};
printf("%s %s is %d years old.\n", one.first, one.last, one.age);
printf("%s %s is %d years old.\n", two.first, two.last, two.age);
return 0;
}
代碼運行正常。但是對於struct pinfo變量 two來說,存在隱患。因為two中的兩個字符串存儲在文字常量區。而在結構中存放的只是兩個地址而已。
printf("one.first's size: %d\n",sizeof(one.first));
printf("two.first's size: %d\n",sizeof(two.first));
結果:
one.first's size: 20
two.first's size: 4
所以pinfo結構中不為字符串分配任何存儲空間。它只適用於在另外的地方已經為字符串分配了空間的情況,且一旦該地址中的內容改變,則結果不可預知。
可以這樣使用pinfo,使用malloc()動態的分配空間,並使字符指針指向新分配的空間,再將目標字符串內容復制到字符指針指向的地址空間。當使用完數據後,再free()。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LEN 20
struct pinfo {
char * first;
char * last;
int age;
};
void setinfo(struct pinfo * ps, char * first, char * last, int age);
void clean(struct pinfo * ps);
int main()
{
char fname[LEN] = "Wqc";
char lname[LEN] = "Oed";
int age = 33;
struct pinfo two;
setinfo(&two,fname,lname,age);
printf("%s %s is %d years old.\n", two.first, two.last, two.age);
//...other operations
clean(&two);
//...other operations
return 0;
}
void setinfo(struct pinfo * ps, char * first, char * last, int age)
{
ps->first = (char *) malloc (strlen(first) + 1);
strcpy(ps->first, first);
ps->last = (char *) malloc (strlen(last) + 1);
strcpy(ps->last, last);
ps->age = age;
}
void clean(struct pinfo * ps)
{
free (ps->first);
free (ps->last);
}
本文出自 “子 孑” 博客,請務必保留此出處http://zhangjunhd.blog.51cto.com/113473/100642