C Language Study - 结构体成员指针初始化

结构体成员指针初始化

不可以正确运行的初始化方式(1):

#include <stdio.h>
#include <string.h>
#include <malloc.h>
//#include "a.h"

//char a[100];
struct stu
{
    char* name;
    int num;
}*pst,st;

void init_pst()
{
    pst = (struct stu *)malloc(sizeof(struct stu));
    //pst->name = (char*)malloc(sizeof(char*));
    //pst->num = 0;
}

void free_pst()
{
    free(pst);
}

int main(void)
{
    //strcpy(pst->name,"Jacy");
    //pst->num = 99;
    init_pst();
    //test();
    strcpy(pst->name,"Jacy");
    pst->num = 99;
    printf("%s %c",pst->name,pst->num);
    free_pst();
    return 0;
}

不可以正确运行的初始化方式(2):

#include <stdio.h>
#include <string.h>
#include <malloc.h>
//#include "a.h"

//char a[100];
struct stu
{
    char* name;
    int num;
}*pst,st;

void init_pst()
{
    NULL;
    //pst = (struct stu *)malloc(sizeof(struct stu));
    //pst->name = (char*)malloc(sizeof(char*));
    //pst->num = 0;
}

void free_pst()
{
    free(pst);
}

int main(void)
{
    //strcpy(pst->name,"Jacy");
    //pst->num = 99;
    init_pst();
    //test();
    strcpy(pst->name,"Jacy");
    pst->num = 99;
    printf("%s %c",pst->name,pst->num);
    free_pst();
    return 0;
}

可以正确运行的初始化方式:

#include <stdio.h>
#include <string.h>
#include <malloc.h>
//#include "a.h"

//char a[100];
struct stu
{
    char* name;
    int num;
}*pst,st;

void init_pst()
{
    pst = (struct stu *)malloc(sizeof(struct stu));
    pst->name = (char*)malloc(sizeof(char*));
    pst->num = 0;
}

void free_pst()
{
    free(pst);
}

int main(void)
{
    //strcpy(pst->name,"Jacy");
    //pst->num = 99;
    init_pst();
    //test();
    strcpy(pst->name,"Jacy");
    pst->num = 99;
    printf("%s %c",pst->name,pst->num);
    free_pst();
    return 0;
}

区别是,为整个结构体分配了内存,以及对结构体的指针成员进行了内存分配(指的是将这个指针指向一块合法的内存,不是为自身分配内存,自身内存已经在定义的时候由编译器分配了)

以后的编程习惯:结构体一定义,立马进行初始化内存分配。

时间: 2024-10-11 21:03:45

C Language Study - 结构体成员指针初始化的相关文章

结构体指针和结构体成员指针

在添加sqlite3的加解密功能函数时,由于网上资料针对的版本是旧版sqlite3源码,现在新版上做修改遇到了一个宏,该宏是旧版上的,它作用是由结构体成员指针pData找到它所属的结构体指针.下面转的文章详解了这种机制. 1.通过结构体成员指针寻找其所属结构体指针 转自http://blog.csdn.net/mycwq/article/details/9327743 宏CONTAINING_RECORD,可以直接根据结构体成员指针找到结构体指针. 我们看一下它的定义: 1 #define CO

在Golang里如何实现结构体成员指针到结构体自身指针的转换

原文地址:http://goworldgs.com/?p=37 在C语言中有一个经典的宏定义,可以将结构体struct内部的某个成员的指针转化为结构体自身的指针.下面是一个例子,通过FIELD_OFFSET宏计算结构体内一个字段的偏移,函数getT可以从一个F*的指针获得对应的T*对象. struct F { int c; int d; } struct T{ int a; int b; struct F f; } #define FIELD_OFFSET(type, field) ((int)

指针直接赋值为整型AND利用宏定义求结构体成员偏移量

首先我们要更正一个很熟悉的概念,那就是指针不仅仅是“地址”,指针还有一个很重要的特性,那就是“类型”. 指针初始化时,“=”的右操作数必须为内存中数据的地址,不可以是变量,也不可以直接用整型地址值(但是 int *p = 0; 除外,该语句表示指针为空): 所以 int *p = 10; 这样的代码是不允许的.在C++里面直接是error的,即使在一些C编译器中以warning的形式提示,但是warning有的时候也很严重.所以这种东西不要用.从const int到int*是不存在隐士转换的.

用结构体指针指向(-&gt;)或结构体变量加点(.)后不出现结构体成员

今天写代码时遇到这么个问题:用结构体指针指向(->)或结构体变量加点(.)后不出现结构体成员,虽然不影响编写,但效率降低,容易出错. 代码入下: stack.h #ifndef __STACK_H__ #define __STACK_H__ #include<stdlib.h> #include<iostream> using namespace std; #define STACK_DEFAULT_SIZE 10; typedef int ElemType; typedef

EDKII CR宏:根据成员指针获取父结构体变量指针

核心提示: 1. CR宏 (Containing Record):根据成员指针获取父结构体变量指针 2. 0 指针的妙用. 在EDKII 的代码中有不少关于CR宏的使用,如 时钟中断处理函数CoreTimerTick. VOID EFIAPI CoreTimerTick ( IN UINT64 Duration ) { IEVENT *Event; ... if (!IsListEmpty (&mEfiTimerList)) { Event = CR (mEfiTimerList.Forward

黑马程序员 C语言-枚举,结构体,指针

一.枚举 ※枚举变量的定义 前面只是定义了枚举类型,接下来就可以利用定义好的枚举类型定义变量. 跟结构体一样,有3种方式定义枚举变量 1.先定义枚举类型,再定义枚举变量 enum Season {spring, summer, autumn, winter}; enum Season s; 2.定义枚举类型的同时定义枚举变量 enum Season {spring, summer, autumn, winter} s; 3.省略枚举名称,直接定义枚举变量 enum {spring, summer

指向结构体的指针

运用指向结构体数组的指针输出学生信息 说明:指针指向结构体数组,就得到了该结构体数组的起始地址.通过该地址可以访问结构体数组中的所有成员变量.其中,指向结构体的指针的算术运算与 指向数组的指针的用法相似. #include<stdio.h> #define N 10 //结构体类型及变量的定义,初始化 struct student { char *number; char *name; char sex; int age; float score; }stu[3]={{"06001&

FFmpeg源码简单分析:结构体成员管理系统-AVOption

===================================================== FFmpeg的库函数源码分析文章列表: [架构图] FFmpeg源码结构图 - 解码 FFmpeg源码结构图 - 编码 [通用] FFmpeg 源码简单分析:av_register_all() FFmpeg 源码简单分析:avcodec_register_all() FFmpeg 源码简单分析:内存的分配和释放(av_malloc().av_free()等) FFmpeg 源码简单分析:常

FFmpeg源代码分析:结构体成员管理系统-AVOption

本文继续上篇文章<FFmpeg源代码分析:结构体成员管理系统-AVClass>中的内容,记录FFmpeg中和AVOption相关的源代码.AVOption用于在FFmpeg中描述结构体中的成员变量.一个AVOption可以包含名称,简短的帮助信息,取值等等. 上篇文章简单回顾 上篇文章中概括了AVClass,AVOption和目标结构体之间的关系.以AVFormatContext为例,可以表示为下图. 有关上篇文章的内容,这里不再重复.总体来说,上篇文章主要概括了AVClass,AVOptio