当前位置:主页   - 电脑 - 程序设计 - C/C++
C:结构中使用字符指针
来源:网络   作者:   更新时间:2012-02-08
收藏此页】    【字号    】    【打印】    【关闭

  下面的例子定义了两个结构,由于成员中存在字符串,所以结构一使用了字符数组,而结构二使用字符指针。

#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: %dn",sizeof(one.first));
printf("two.first's size: %dn",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

其它资源
来源声明

版权与免责声明
1、本站所发布的文章仅供技术交流参考,本站不主张将其做为决策的依据,浏览者可自愿选择采信与否,本站不对因采信这些信息所产生的任何问题负责。
2、本站部分文章来源于网络,其版权为原权利人所有。由于来源之故,有的文章未能获得作者姓名,署“未知”或“佚名”。对于这些文章,有知悉作者姓名的请告知本站,以便及时署名。如果作者要求删除,我们将予以删除。除此之外本站不再承担其它责任。
3、本站部分文章来源于本站原创,本站拥有所有权利。
4、如对本站发布的信息有异议,请联系我们,经本站确认后,将在三个工作日内做出修改或删除处理。
请参阅权责声明