精华内容
下载资源
问答
  • 在结构体内定义字符指针 使用时,另外根据情况申请内存,如下: struct strData {  int nHead;  int nLen;  char *pt; }; strData data; data.pt = (char*)malloc(100); // 申请100个字节的空间 ...

    在结构体内定义字符指针

    使用时,另外根据情况申请内存,如下:

    struct strData

    {

      int nHead;

      int nLen;

      char *pt;

    };

    strData data;

    data.pt = (char*)malloc(100); // 申请100个字节的空间

    使用后记得用free释放指针

    引申:

    动态存储分配
    在数组一章中,曾介绍过数组的长度是预先定义好的,在整个程序中固定不变。C语言中不允许动态数组类型。
    例如:
    int n;
        scanf("%d",&n);
    int a[n];
    用变量表示长度,想对数组的大小作动态说明,这是错误的。但是在实际的编程中,往往会发生这种情况,即所需的内存空间取决于实际输入的数据,而无法预先确定。对于这种问题,用数组的办法很难解决。为了解决上述问题,C语言提供了一些内存管理函数,这些内存管理函数可以按需要动态地分配内存空间,也可把不再使用的空间回收待用,为有效地利用内存资源提供了手段。
    常用的内存管理函数有以下三个:
    1. 分配内存空间函数malloc
    调用形式:
      (类型说明符*)malloc(size)
    功能:在内存的动态存储区中分配一块长度为"size"字节的连续区域。函数的返回值为该区域的首地址。
    “类型说明符”表示把该区域用于何种数据类型。
    (类型说明符*)表示把返回值强制转换为该类型指针。
    “size”是一个无符号数。
    例如:
              pc=(char *)malloc(100);
    表示分配100个字节的内存空间,并强制转换为字符数组类型,函数的返回值为指向该字符数组的指针,把该指针赋予指针变量pc。
    2. 分配内存空间函数 calloc
     calloc 也用于分配内存空间。
    调用形式:
      (类型说明符*)calloc(n,size)
    功能:在内存动态存储区中分配n块长度为“size”字节的连续区域。函数的返回值为该区域的首地址。
    (类型说明符*)用于强制类型转换。
    calloc函数与malloc 函数的区别仅在于一次可以分配n块区域。
    例如:
         ps=(struet stu*)calloc(2,sizeof(struct stu));
    其中的sizeof(struct stu)是求stu的结构长度。因此该语句的意思是:按stu的长度分配2块连续区域,强制转换为stu类型,并把其首地址赋予指针变量p。
    3. 释放内存空间函数free
    调用形式:
      free(void*ptr);
    功能:释放ptr所指向的一块内存空间,ptr是一个任意类型的指针变量,它指向被释放区域的首地址。被释放区应是由malloc或calloc函数所分配的区域。
    【例】分配一块区域,输入一个学生数据。
    main()
    {
        struct stu
        {
          int num;
          char *name;
          char sex;
          float score;
        }  *ps;
        ps=(struct stu*)malloc(sizeof(struct stu));
        ps->num=102;
        ps->name="Zhang ping";
        ps->sex='M';
        ps->score=62.5;
        printf("Number=%d\nName=%s\n",ps->num,ps->name);
        printf("Sex=%c\nScore=%f\n",ps->sex,ps->score);
        free(ps);
    }
     
    本例中,定义了结构stu,定义了stu类型指针变量ps。然后分配一块stu大内存区,并把首地址赋予ps,使ps指向该区域。再以ps为指向结构的指针变量对各成员赋值,并用printf输出各成员值。最后用free函数释放ps指向的内存空间。整个程序包含了申请内存空间、使用内存空间、释放内存空间三个步骤,实现存储空间的动态分配
    而 malloc 则必须由我们计算要字节数,并且在返回后强行转换为实际类型的指针。 
    
    int* p; 
    
    p = (int *) malloc (sizeof(int)); 
    
    第一、malloc 函数返回的是 void * 类型,如果你写成:p = malloc (sizeof(int)); 则程序无法通过编译,报错:“不能将 void* 赋值给 int * 类型变量”。所以必须通过 (int *) 来将强制转换。 
    
    第二、函数的实参为 sizeof(int) ,用于指明一个整型数据需要的大小。如果你写成: 
    
    int* p = (int *) malloc (1); 
    
    代码也能通过编译,但事实上只分配了1个字节大小的内存空间,当你往里头存入一个整数,就会有3个字节无家可归,而直接“住进邻居家”!造成的结果是后面的内存中原有数据内容全部被清空.

    来源:alaiblog

    转载于:https://www.cnblogs.com/alaigle/archive/2012/05/24/2516090.html

    展开全文
  • 有这么一个结构体 ``` typedef struct imageBufferStruct { char *data_im; float *data_depth; }imageBuffer; ``` ...请问结构体内指针的容器怎么push_back类似的例子 谢谢大神给个链接例子
  • c语言结构体内嵌结构体指针Prerequisite: 先决条件: Structures in C programming language. C编程语言中的结构。 Dynamic Memory allocation functions in C. C中的动态内存分配功能。 Example: In this ...

    c语言结构体内嵌结构体指针

    Prerequisite:

    先决条件:

    Example: In this tutorial, we will use a structure for “student”, structure members will be "name" (string type), "age" (integer type), "roll number" (integer type).

    示例:在本教程中,我们将为“学生”使用结构,结构成员将为“名称”(字符串类型),“年龄”(整数类型),“卷数”(整数类型)。

    结构声明 (Structure declaration)

        struct student{
    	    char name[50];
    	    int age;
    	    int rollno;
        };
    
    

    Here,

    这里,

    • struct is the keyword to define a structure.

      struct是定义结构的关键字。

    • student is the name of the structure.

      学生是结构的名称。

    • name is the first structure member to store age with maximum of 50 characters, age is second structure member to store age of the student, and rollno is the third structure member to store rol number of the student.

      name是存储年龄最多的50个字符的第一个结构成员, age是存储学生年龄的第二个结构成员, rollno是存储学生的编号的第三个结构成员。

    指向结构声明的指针 (Pointer to structure declaration)

        struct student *ptr;
    
    

    将内存分配给结构指针 (Allocating memory to the pointer to structure)

        ptr = (struct student*)malloc(sizeof(struct student));
    
    

    The statement will declare memory for one student’s record at run time. Read more about the dynamic memory allocation in C programming language.

    该语句将在运行时声明对一个学生的记录的记忆。 阅读有关C编程语言中动态内存分配的更多信息。

    使用指针访问结构成员 (Accessing structure members using pointer)

    The arrow operator (->) is used to access the members of the structure using pointer to structure. For example, we want to access member name, and ptr is the pointer to structure. The statement to access name will be ptr->name.

    箭头运算符 ( -> )用于使用指向结构的指针访问结构的成员。 例如,我们要访问成员名称 ,而ptr是指向structure指针 。 访问名称的语句将是ptr-> name 。

    指向结构的C程序 (C program for pointer to structure)

    #include <stdio.h>
    
    //structure definition
    struct student{
    	char name[50];
    	int age;
    	int rollno;
    };
    
    //main function
    int main(){
    	//pointer to structure declaration
    	struct student *ptr;
    	
    	//allocating memory at run time 
    	ptr = (struct student*)malloc(sizeof(struct student));
    	
    	//check memory availability
    	if( ptr == NULL){
    		printf("Unable to allocate memory!!!\n");
    		exit(0);
    	}
    	
    	//reading values of the structure
    	printf("Enter student details...\n");
    	printf("Name? ");
    	scanf("%[^\n]", ptr->name); //reads string with spaces
    	printf("Age? ");
    	scanf("%d", &ptr->age);
    	printf("Roll number? ");
    	scanf("%d", &ptr->rollno);
    	
    	//printing the details
    	printf("\nEntered details are...\n");
    	printf("Name: %s\n", ptr->name);
    	printf("Age: %d\n", ptr->age);
    	printf("Roll number: %d\n", ptr->rollno);
    	
    	//freeing dynamically allocated memory
    	free(ptr);
    	
    	return 0;
    }
    
    

    Output

    输出量

        Enter student details...
        Name? Amit shukla
        Age? 21
        Roll number? 100
    
        Entered details are...
        Name: Amit shukla
        Age: 21
        Roll number: 100
    
    
    

    翻译自: https://www.includehelp.com/c/pointer-to-structure.aspx

    c语言结构体内嵌结构体指针

    展开全文
  • 结构体内嵌函数指针解析

    千次阅读 2018-06-16 22:14:01
    结构体内嵌函数指针定义 typedef struct Factory_s{//结构体内嵌函数指针 int (*init)(void);//函数指针 int (*produce)(int num); int (*consume)(int num); }Factory; 结构体内嵌函数指针的初始化 ...

    结构体内嵌函数指针的定义

    typedef struct Factory_s{//结构体内嵌函数指针
      int (*init)(void);//函数指针
      int (*produce)(int num);
      int (*consume)(int num);
    }Factory;
    


    结构体内嵌函数指针的初始化

    Factory factory={//结构体初始化
        .init=apple_init,   
        .produce=apple_produce,
        .consume=apple_consume,
    };
    
    Factory *a_factory[]={//指针数组中的每一个元素均为指针,即有诸如
        &factory;       //“a_factory[i]”的指针。
    };


    结构体内嵌函数指针的优势


    以上面代码为例:
    实际操作的API为

    int apple_init(void);
    int apple_produce(int num);
    int apple_consume(int num);
    


    但,现在却可以将它们”隐藏“起来。用户调用

    a_factory[i].init();
    a_factory[i].produce(n1);
    a_factory[i].consume(n2);
    


    即可。

    展开全文
  • DeviceIoControl和结构体内指针

    千次阅读 2008-08-21 22:43:00
    //========================================================================//TITLE:// DeviceIoControl和结构体内指针//AUTHOR:// norains//DATE:// Thursday 21-August-2008//Environment:// NONE//=====

    //========================================================================
    //TITLE:
    //    DeviceIoControl和结构体内嵌指针
    //AUTHOR:
    //    norains
    //DATE:
    //    Thursday 21-August-2008
    //Environment:
    //    NONE
    //========================================================================
        首先我们先来看几段最简单的代码:
     
        这是定义了的一个参数结构:
        typedef struct _DEV_Param
        {
        UNCHAR DeviceAddr;
        UNCHAR nWriteByte;
        UNCHAR *pWriteBuffer;
        UNCHAR nReadByte;
        UNCHAR *pReadBuffer;
       } DEV_Param;
     
       接下来这是驱动里面的响应DeviceIoControl的函数:
       BOOL DEV_IOControl( DWORD hOpenContext, DWORD dwCode, PBYTE pBufIn, DWORD dwLenIn, PBYTE pBufOut, DWORD dwLenOut, PDWORD pdwActualOut )
       {
         ....
        
        DEV_Param *pDEV_Param = (DEV_Param *)pBufIn;
        for(int i = 0; i < pDEV_Param->nWriteByte; i++)
        {
         RETAILMSG(TRUE,(TEXT("Write code is [%x]/n"),pDEV_Param->pWriteBuffer[i]));
        }
       
        ...
       }
     
       再然后呢,我们在应用程序中调用该驱动: 
       ....
      
       DEV_Param param = {0};
      
       UNCHAR szBuf[20] = {0x10,0x20,0x30};
       param.nWriteByte = 20;
       param.pWriteBuffer = szBuf;
      
       ...
       DeviceIoControl(hd,IOCTL_WRITE,&param,sizeof(param),NULL,NULL,NULL);
      
       ...
      
      
       如果我说,RETAILMSG(TRUE,(TEXT("Write code is [%x]/n"),pDEV_Param->pWriteBuffer[i]))这语句能否正确输出pWriteBuffer里面的数值,取决于应用程序的szBuf的定义:比方说,当szBuf为局部变量,就能正常输出;如果为static或全局变量,输出就不正常,你会不会觉得奇怪?
      
       没办法,但事实确实如此。因为这涉及到驱动的安全问题。其实我们在传递param时,系统已经对其地址做了一次转换。另一方面,因为系统并不知道你传过来的是内嵌有指针的结构体,所以需要自己动手进行转换。
      
       因此,我们只需要在驱动中手工调用一次MapCallerPtr函数进行转换即可:
      
        BOOL DEV_IOControl( DWORD hOpenContext, DWORD dwCode, PBYTE pBufIn, DWORD dwLenIn, PBYTE pBufOut, DWORD dwLenOut, PDWORD pdwActualOut )
       {
         ....
        
        DEV_Param *pDEV_Param = (DEV_Param *)pBufIn;
        
         if(pDEV_Param->pWriteBuffer != NULL)
         {
          pDEV_Param->pWriteBuffer = (UCHAR *)MapCallerPtr((VOID *)pDEV_Param->pWriteBuffer,pDEV_Param->nWriteByte);    
         }
         
         if(pDEV_Param->pReadBuffer != NULL)
         {
          pDEV_Param->pReadBuffer = (UCHAR *)MapCallerPtr((VOID *)pDEV_Param->pReadBuffer,pDEV_Param->nReadByte);    
         }
        
        for(int i = 0; i < pDEV_Param->nWriteByte; i++)
        {
         RETAILMSG(TRUE,(TEXT("Write code is [%x]/n"),pDEV_Param->pWriteBuffer[i]));
        }
        
        ...
       }
      
        经历这么一次转换之后,应用程序调用驱动就能正常输出了。

    展开全文
  • 最近实验室的小伙伴们突然问我,在结构体内创建指针,如何开辟其内存大小,有种极其简单且易想到的方法,就是外部对其malloc空间,但是本文可以给出两种比较优雅的实现方式。 1.利用构造结构体构造函数实现 跟...
  • 1、前一篇文章中提到,尽量不要使用赋值操作符来操作结构体,这其中所涉及的便是结构体的深度拷贝。  对于下面这个例子:  struct teacher { char szName[24]; int age; double income; } 进行如下的操作...
  • 结构体内指针变量的赋值

    千次阅读 2018-12-12 20:02:27
    问题描述  某结构体的定义如下: typedef struct {  int iAge; // 年龄  char szAddr1[100]; // 地址1  char *pszAddr2; // 地址2  char **pszAddr3; // 地址3 } T_Pe...
  • 结构体内的数组用指针表示的时候要注意指针溢出造成不必要的bug
  • 未初始化的指针,动态分配内存,未释放结构体内指针所指向的空间,总结未初始化的指针动态分配内存未释放结构体内指针所指向的空间总结 未初始化的指针 首先我们来说明一下我们之前经常用到的一个例子,然后修改代码...
  • 结构体中是可以定义函数的,C语言中只能定义函数指针,如下面的结构体中的void (*printInfo)(struct person *per); struct person { char *name; int age; char *work; void (*printInfo)(struct person *per)...
  • 结构体中定义指针

    千次阅读 2013-11-05 11:51:14
    结构体指针变量的定义定义结构体变量的一般形式如下: 形式1:先定义结构体类型,再定义变量 struct结构体标识符 { 成员变量列表;… }; struct 结构体标识符 *指针变量名; 变量初始化一:struct结构体...
  • 函数定义指针或者变量已经为指针本身和变量本身分配了内存所以用指针指向一个已经定义的变量时不需再分配内存 但是数据结构中用指针指向结构体时只为指针本身分配了内存如果要对结结构体填入内容就要分配一个...
  • 这是IplImage结构体的定义,其中imageData是char型的指针用其对灰度图像进行像素值操作时,得到的像素值不是位于1-255区间的,所以我是将其转化为unsigned char型数据后再进行操作,但是,对其中的关系想的不是...
  • 结构体中定义函数指针

    千次阅读 2017-03-06 23:34:22
    结构体指针变量的定义定义结构体变量的一般形式如下: 形式1:先定义结构体类型,再定义变量 struct结构体标识符 ...形式2:在定义类型的同时定义变量 struct结构体标识符 { 成员变量列
  • C语言结构体中定义函数指针详解

    万次阅读 多人点赞 2015-12-30 17:24:09
    学习嵌入式我们经常和结构体函数指针打交道,还有链表,环形缓冲区之类的,这里中点讲解结构体中定义函数指针。下面这个程序你看一遍你基本也明白用法了。 下面是我写的一个很简单的程序struct.c #include /* 标准...
  • 如何定义结构体指针

    2016-11-16 20:00:36
    // 想要定义结构体类型的指针一定要用typedef // 写法1 typedef struct node{ int value; node* next; }*nodePtr; nodePtr head = new node(); node* head1 = new node();// 两种写法等价
  • C语言编程时,常常会定义结构体,而且结构体里面常常会有数组,比如如下所示: typedef struct  { int data[MAX_HEAP_SIZE]; unsigned int heap_size; }HeapType;  这是一个堆的数据结构,包含堆的元素...
  • 最近STM的GPIO结构体定义中看到源代码的时候,顺便复习下结构体指针变量的定义及typedef 的使用。 1.结构体类型定义 定义方式1: Typedef struct LNode { int data; // 数据域 struct LNode *next; // 指针...
  • 是这样的,结构体中,我定义handler是一个指向函数的指针变量,cmd是指向控制台输入的命令的指针变量。根据cmd值的不同,程序将不同的函数地址赋给handler。c中,可以这么定义,int (*handler)(),但是我不知道...
  • 定义自身类型的成员是不可以的 定义结构体时,是不可以定义自身类型的成员的。这是因为结构体中各个成员...但是可以定义该结构体类型的指针,因为指针在固定的平台上所占的内存大小是确定的! 比如: typedef struc...
  • 结构体指针定义和引用

    千次阅读 2014-11-27 10:35:01
    指针变量非常灵活方便,可以指向任一类型的变量,若定义指针变量指向结构体类型变 量,则可以通过指针来引用结构体类型变量。 7.3.1 指向结构体类型变量的使用 首先让我们定义结构体: struct stu { char name...
  • 浅谈结构体内变量赋值问题

    万次阅读 多人点赞 2017-08-27 16:59:00
    结构体内变量赋值暂且分为三种(笔者此时只能想到三种) 1.定义时赋值 2.定义后对变量挨个赋值 3.利用函数进行赋值 赋值时再分为两类 1.非数组赋值 2.数组赋值 1.比较简单,此不做过多介绍,只是简单贴下代码。 ...
  • 数据结构中的二级指针和引用

    千次阅读 2017-01-05 15:45:49
    但是C语言的算法描述中,由于C语言没有像C++一样的引用变量,因此出现了所谓的“二级指针”,很多C语言和数据结构的小白们对此不解;再者有的教材中(比如清华版严蔚敏的《数据结构》)用了类C的伪代码来描述数据...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 29,050
精华内容 11,620
关键字:

在结构体内定义指针