程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C結構中使用字符指針

C結構中使用字符指針

編輯:關於C語言

下面的例子定義了兩個結構,由於成員中存在字符串,所以結構一使用了字符數組,而結構二使用字符指針。

#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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved