精华内容
下载资源
问答
  • 10月24日是程序员节,1024 =210、210既210之意。将C++代码转化为C的过程中,一些C++的特性无法使用类内私有变量在...这时候遇到一个问题,结构体中包含了另一个结构体指针,这导致了我malloc的时候,另一个结构体...

    码农公社  210.net.cn  210是何含义?10月24日是程序员节,1024 =210、210既

    210

    之意。

    将C++代码转化为C的过程中,一些C++的特性无法使用

    类内私有变量在类内公共函数中使用,转化为C的时候选择用malloc的方式,申请一段内存空间去存储它,在函数中传指针形参去操作这些变量。

    这时候遇到一个问题,结构体中包含了另一个结构体的指针,这导致了我malloc的时候,另一个结构体中的内存空间没有申请到。

    总结了如下的简单示例:

    #include 

    #include 

    typedef struct _point{

    int m;

    int n;

    }point, *ppoint;

    typedef struct _PELoader{

    int m_hModule;

    ppoint m_pImportDesp;

    }PELoader, *PPELoader;

    void load(PELoader **Ldr);

    int main()

    {

    printf("%d

    ", sizeof(PELoader));//这里输出为8,说明分配给了m_hModule四个字节,并且分配了一个指针的大小:4个字节给这个结构体

    PPELoader Ldr = (PPELoader)malloc(sizeof(PELoader));

    Ldr->m_pImportDesp = (ppoint)malloc(sizeof(point));//在这里给m_pImportDesp指针指向的结构体(point)分配空间

    load(Ldr);

    printf("%d,%d,%d", Ldr->m_pImportDesp->m, Ldr->m_pImportDesp->n, Ldr->m_hModule);

    return 0;

    }

    void load(PELoader *Ldr)

    {

    Ldr->m_hModule = 2;

    Ldr->m_pImportDesp->m = 3;//如果没有给m_pImportDesp指向的结构体分配空间,运行到这里会发生内存中断的情况

    Ldr->m_pImportDesp->n = 5;

    }

    展开全文
  • 今天终于看完了C语言深度剖析这本书,对C语言有了进一步的了解与感悟,突然发觉原来自己学C语言的时候学得是那样的迷糊,缺少深入的...定义了指针变量,没有为指针分配内存,即指针没有在内存中指向一块合法的内存...

    今天终于看完了C语言深度剖析这本书,对C语言有了进一步的了解与感悟,突然发觉原来自己学C语言的时候学得是那样的迷糊,缺少深入的思考,在重新看书的时候发觉C语言基本教材虽然经典,但是缺乏独到性,老师在讲解的过程中也就照本宣科了,没有多大的启迪。

    看到C语言内存管理这块,发觉还是挺有用的,当然平时在编程时基本上就没有考虑过内存问题。

    定义了指针变量,没有为指针分配内存,即指针没有在内存中指向一块合法的内存,尤其是结构体成员指针未初始化,往往导致运行时提示内存错误。

    69c5a8ac3fa60e0848d784a6dd461da6.png#include "stdio.h"#include"string.h"

    structstudent

    {char *name;intscore;struct student *next;

    }stu,*stul;intmain()

    {

    strcpy(stu.name,"Jimy");

    stu.score= 99;return 0;

    }

    69c5a8ac3fa60e0848d784a6dd461da6.png

    由于结构体成员指针未初始化,因此在运行时提示内存错误

    69c5a8ac3fa60e0848d784a6dd461da6.png#include “stdio.h”

    #include"malloc.h"#include"string.h"

    structstudent

    {char *name;intscore;struct student*next;

    }stu,*stu1;intmain()

    {

    stu.name= (char*)malloc(sizeof(char)); /*1.结构体成员指针需要初始化*/strcpy(stu.name,"Jimy");

    stu.score= 99;

    stu1= (struct student*)malloc(sizeof(struct student));/*2.结构体指针需要初始化*/stu1->name = (char*)malloc(sizeof(char));/*3.结构体指针的成员指针同样需要初始化*/stu.next=stu1;

    strcpy(stu1->name,"Lucy");

    stu1->score = 98;

    stu1->next =NULL;

    printf("name %s, score %d \n",stu.name, stu.score);

    printf("name %s, score %d \n",stu1->name, stu1->score);

    free(stu1);return 0;

    }

    69c5a8ac3fa60e0848d784a6dd461da6.png

    同时也可能出现没有给结构体指针分配足够的空间

    stu1 = (struct student*)malloc(sizeof(struct student));/*2.结构体指针需要初始化*/

    如本条语句中往往会有人写成

    stu1 = (struct student*)malloc(sizeof(struct student *));/*2.结构体指针需要初始化*/

    这样将会导致stu1的内存不足,因为sizeof(struct student)的长度为8,而sizeof(struct student

    *)的长度为4,在32位系统中,编译器默认会给指针分配4字节的内存

    原文:http://www.cnblogs.com/lijumiao/p/3624066.html

    展开全文
  • 结构体指针,可细分为指向结构体变量的指针和指向结构体数组的指针。指向结构体变量的指针前面我们通过“结构体变量名.成员名”的方式引用结构体变量中的成员,除了这种方法之外还可以使用指针。前面讲过,&...

    结构体指针,可细分为指向结构体变量的指针和指向结构体数组的指针。

    指向结构体变量的指针

    前面我们通过“结构体变量名.成员名”的方式引用结构体变量中的成员,除了这种方法之外还可以使用指针。

    前面讲过,&student1 表示结构体变量 student1 的首地址,即 student1 第一个项的地址。如果定义一个指针变量 p 指向这个地址的话,p 就可以指向结构体变量 student1 中的任意一个成员。

    那么,这个指针变量定义成什么类型呢?只能定义成结构体类型,且指向什么结构体类型的结构体变量,就要定义成什么样的结构体类型。比如指向 struct STUDENT 类型的结构体变量,那么指针变量就一定要定义成 struct STUDENT* 类型。

    下面将前面的程序用指针的方式修改一下:

    # include

    # include

    struct AGE

    {

    int year;

    int month;

    int day;

    };

    struct STUDENT

    {

    char name[]; //姓名

    int num; //学号

    struct AGE birthday; //生日

    float score; //分数

    };

    int main(void)

    {

    struct STUDENT student1; /*用struct STUDENT结构体类型定义结构体变量student1*/

    struct STUDENT *p = NULL; /*定义一个指向struct STUDENT结构体类型的指针变量p*/

    p = &student1; /*p指向结构体变量student1的首地址, 即第一个成员的地址*/

    strcpy((*p).name, "小明"); //(*p).name等价于student1.name

    (*p).birthday.year = ;

    (*p).birthday.month = ;

    (*p).birthday.day = ;

    (*p).num = ;

    (*p).score = ;

    printf("name : %s\n", (*p).name); //(*p).name不能写成p

    printf("birthday : %d-%d-%d\n", (*p).birthday.year, (*p).birthday.month, (*p).birthday.day);

    printf("num : %d\n", (*p).num);

    printf("score : %.1f\n", (*p).score);

    return ;

    }

    输出结果是:

    name : 小明

    birthday : 1989-3-29

    num : 1207041

    score : 100.0

    我们看到,用指针引用结构体变量成员的方式是:

    (*指针变量名).成员名

    注意,*p 两边的括号不可省略,因为成员运算符“.”的优先级高于指针运算符“*”,所以如果 *p 两边的括号省略的话,那么 *p.num 就等价于 *(p.num) 了。

    从该程序也可以看出:因为指针变量 p 指向的是结构体变量 student1 第一个成员的地址,即字符数组 name 的首地址,所以 p 和 (*p).name 是等价的。

    但是,“等价”仅仅是说它们表示的是同一个内存单元的地址,但它们的类型是不同的。指针变量 p 是 struct STUDENT* 型的,而 (*p).name 是 char* 型的。所以在 strcpy 中不能将 (*p).name 改成 p。用 %s 进行输入或输出时,输入参数或输出参数也只能写成 (*p).name 而不能写成 p。

    同样,虽然 &student1 和 student1.name 表示的是同一个内存单元的地址,但它们的类型是不同的。&student1 是 struct STUDENT* 型的,而 student1.name 是 char* 型的,所以在对 p 进行初始化时,“p=&student1;”不能写成“p=student1.name”。因为 p 是 struct STUDENT* 型的,所以不能将 char* 型的 student1.name 赋给 p。

    此外为了使用的方便和直观,用指针引用结构体变量成员的方式:

    (*指针变量名).成员名

    可以直接用:

    指针变量名->成员名

    来代替,它们是等价的。“->”是“指向结构体成员运算符”,它的优先级同结构体成员运算符“.”一样高。p->num 的含义是:指针变量 p 所指向的结构体变量中的 num 成员。p->num 最终代表的就是 num 这个成员中的内容。

    下面再将程序用“->”修改一下:

    # include

    # include

    struct AGE

    {

    int year;

    int month;

    int day;

    };

    struct STUDENT

    {

    char name[]; //姓名

    int num; //学号

    struct AGE birthday; /*用struct AGE结构体类型定义结构体变量birthday, 生日*/

    float score; //分数

    };

    int main(void)

    {

    struct STUDENT student1; /*用struct STUDENT结构体类型定义结构体变量student1*/

    struct STUDENT *p = NULL; /*定义struct STUDENT结构体类型的指针变量p*/

    p = &student1; /*p指向结构体变量student1的首地址, 即第一项的地址*/

    strcpy(p->name, "小明");

    p->birthday.year = ;

    p->birthday.month = ;

    p->birthday.day = ;

    p->num = ;

    p->score = ;

    printf("name : %s\n", p->name); //p->name不能写成p

    printf("birthday : %d-%d-%d\n", p->birthday.year, p->birthday.month, p->birthday.day);

    printf("num : %d\n", p->num);

    printf("score : %.1f\n", p->score);

    return ;

    }

    [转]C语言字节对齐问题详解

    C语言字节对齐问题详解 转载:https://www.cnblogs.com/clover-toeic/p/3853132.html 引言 考虑下面的结构体定义: typedef struct{ ch ...

    Linux C 语言之 Hello World 详解

    目录 Linux C 语言之 Hello World 详解 第一个 C 语言程序 程序运行原理 编译,链接 运行时 链接库 编译器优化 Hello World 打印原理 stdout, stdin 和 ...

    C语言解决约瑟夫问题详解的代码

    将开发过程中比较重要的一些内容做个收藏,下面的内容是关于C语言解决约瑟夫问题详解的内容,希望能对码农有帮助. #pragma once #include class PRO ...

    C语言字节对齐问题详解

    引言 考虑下面的结构体定义: typedef struct{ char c1; short s; char c2; int i; }T_FOO; 假设这个结构体的成员在内存中是紧凑排列的,且c1的起始 ...

    C语言预处理器命令详解【转】

    本文转载自:http://www.cnblogs.com/clover-toeic/p/3851102.html 一  前言 预处理(或称预编译)是指在进行编译的第一遍扫描(词法扫描和语法分析)之前所 ...

    C语言字节对齐问题详解(对齐、字节序、网络序等)

    首先说明一下,本文是转载自: http://www.cnblogs.com/clover-toeic/p/3853132.html 博客园用的少,不知道怎么发布转载文章,只能暂时这样了. 引言 考虑下 ...

    C语言字节对齐问题详解【转】

    引言 转自:http://www.cnblogs.com/clover-toeic/p/3853132.html 考虑下面的结构体定义: 1 typedef struct{ 2 char c1; 3 ...

    c语言文件操作函数详解

    一.文件操作注意点: 1 打开文件时,如果打开方式加“+”,表示该文件可以“写” ; 2 退出程序一般用exit函数,正常退出参数为0,非正常退出参数为正零值 ; 3 文件的读写操作:按字符.字符串. ...

    C语言链表各类操作详解

    链表概述 链表是一种常见的重要的数据结构.它是动态地进行存储分配的一种结构.它可以根据需要开辟内存单元.链表有一个“头指针”变量,以head表示,它存放一个地址.该地址指向一个元素.链表中每一个元素称 ...

    【C语言】printf函数详解

    C语言printf函数详解 一.相关基础知识 请求printf()打印变量的指令取决于变量的类型,例如打印整数用%d符号,打印字符用%c符号,这些符号称为转换说明(conversion specifi ...

    随机推荐

    QoS 测量 (目标,方法,协议)

    本文翻译自ITU-T的Technical Paper:

    spring+mybatis的优缺点

    mybatis的优缺点: 优点: 1. 易于上手和掌握. 2. sql写在xml里,便于统一管理和优化. 3. 解除sql与程序代码的耦合. 4. 提供映射标签,支持对象与数据库的orm字段关系映射 ...

    【转】android应用开发全程实录-你有多熟悉listview?---不错

    原文网址:http://www.cnblogs.com/noTice520/archive/2011/12/05/2276379.html 今天给大家带来 ...

    CCF系列之日期计算(201509-2)

    试题编号: 201509-2 时间限制: 1.0s 内存限制: 256.0MB 问题描述 给定一个年份y和一个整数d,问这一年的第d天是几月几日? 注意闰年的2月有29天.满足下面条件之一的是闰年: ...

    pipe size设置

    我所用的软件架构,使用pipe来实现线程之间的大量数据的传输.在实际操作中,pipe中传输的是数据的指针,而不是数据本身.  但是在调试过程中,我发现,如果我尝试往pipe里面write10000个指 ...

    [Leetcode]237. Delete Node in a Linked List -David_Lin

    Write a function to delete a node (except the tail) in a singly linked list, given only access to th ...

    [转] Form 表单数据处理 简单教程 formidable 使用心得

    入门,高手见笑 表单数据一种是get方式, 另一种是post 方式 1.get方式 对于get方式,node处理起来非常简单 如以下代码: var urlParsed = url.parse(requ ...

    Unity中的定时器与延时器

    JavaScript中的定时器与延时器,分别是 setInterval.setTimeout,对应的清理函数是:clearInterval.clearTimeout. 而在Unity中,则分别是:In ...

    随机数的组合问题(JavaScript描述)

    随机数的组合问题在面试时是经常考的,比如之前我就被问到:“有一个可以生成1-5的随机数函数,怎样把它扩大到1-7?” 在解决这个问题之前,先来看看另外一个比较简单的问题:“有一个可以生成1-7的函数, ...

    展开全文
  • C语言 结构体指针

    2021-05-21 05:49:43
    */ //结构体指针 //结构体指针 如果指向的是数组的话,有三层含义。 /** * 1、数组的首地址 2、数组中第一个元素(结构体变量)的首地址 3、第一个结构体变量中第一个成员变量的首地址 */ Student *pStu = stus; ...

    //#import 可以防止重复导入头文件

    #import "Student.h"

    #import "Student.h"

    //#include 不能防止重复导入头文件

    //#include "Student.h"

    //#include "Student.h"

    //宏

    //宏定义的第一种方式:名称全部大写

    #define ARRAYCOUNT 6

    //宏定义的第二种方式:k + 驼峰法

    #define kLeftPadding 80

    #define PI 3.14

    #define kSum(A, B) A + B

    #define kMul(A, B) (A) * (B)

    #define kMax(A, B) (A) > (B) ? (A) : (B)

    #define kDeviceVersion [UIDevice currentDevice].version

    int main(int argc, const char * argv[]) {

    #ifdef kLeftPadding

    printf("hahaha\n");

    #else

    printf("hehehe\n");

    #endif

    Student stu = {25, "yaoqianghong", 23, 'm', 98.0};

    //结构体指针指向的是 结构体变量的首地址,也是结构体变量中第一个成员的首地址

    Student *p = &stu;

    printf("%p %p %p\n",p, &stu, &(p->num));

    strcpy((*p).name, "chengjinwei");

    printf("%s\n",(*p).name);

    printf("%d %s %d %c %.2f\n",p->num, p->name, p->age, p->gender, p->score);

    Cpoint m = {3, 3};

    Cpoint n = {6, 7};

    Cpoint *p1 = &m;

    Cpoint *p2 = &n;

    float distance = distanceOfTwoPoint(p1, p2);

    printf("%.2f",distance);

    //    请通过p将name成员中的第一个字母改成 大写, 所有’(空格)’改成下划线’_’

    Student stu1 = {1, "gu ju ju", 22, 'f', 60.0};

    Student *qStu = &stu1;

    changeCharacterOfName(qStu, '+');

    printf("%s\n",qStu->name);

    /*

    char mName[20] = {0};

    strcpy(mName, qStu->name);

    mName[0] = mName[0] - ('a' - 'A');

    printf("%c\n",mName[0]);

    int i = 0;

    while (mName[i] != '\0') {

    if (' ' == mName[i]) {

    mName[i] = '_';

    }

    i ++;

    }

    strcpy(qStu->name, mName);

    printf("%s\n",qStu->name);

    */

    Student stus[ARRAYCOUNT] = {

    {1, "chengjinwei", 30, 'm', 78.0},

    {2, "yulinlin", 22, 'f', 97.0},

    {3, "fangjingyun", 21, 'f', 98.0},

    {4, "xumin", 22, 'f', 98.5},

    {5, "wangweishuai", 22, 'm', 97.5},

    {6, "shenzengtao", 23, 'm', 60.0}

    };

    /**

    *  int array[5] = {1, 2, 3, 4, 5};

    int *p = array;

    */

    //结构体指针

    //结构体指针 如果指向的是数组的话,有三层含义。

    /**

    *  1、数组的首地址

    2、数组中第一个元素(结构体变量)的首地址

    3、第一个结构体变量中第一个成员变量的首地址

    */

    Student *pStu = stus;

    printf("%s\n",(*pStu).name);

    /**

    *

    1、pStu[1].name   stus[1].name

    2、(*(pStu + 1)).name   (*(stus + 1)).name

    3、(pStu + 1)->name    (stus + 1)->name

    *

    */

    for (int i = 0; i < 6; i ++) {

    printf("%d %s %d %c %.2f\n",(*(pStu + i)).num, (*(pStu + i)).name, (*(pStu + i)).age, (*(pStu + i)).gender, (*(pStu + i)).score);

    }

    /**

    *  使用指针查找学员数组中性别为男的学员,成绩增加10分,超过100分的记为100分

    */

    modifyScoreOfStudent(pStu, 6);

    for (int i = 0; i < 6; i ++) {

    printf("%d %s %d %c %.2f\n",(*(pStu + i)).num, (*(pStu + i)).name, (*(pStu + i)).age, (*(pStu + i)).gender, (*(pStu + i)).score);

    }

    //宏只做替换,不做运算!!!

    printf("%d\n",kMul(6 - 3, 4 + 5));

    printf("%d\n",kMax(10, 20));

    printf("kLeftPadding = %d\n",kLeftPadding);

    int r = 0;

    printf("请输入一个 圆的半径:");

    scanf("%d",&r);

    float s = PI * r * r;

    printf("圆的面积为:%f",s);

    展开全文
  • c语言结构体指针初始化 今天来讨论一下C中的内存管理。记得上周在饭桌上和同事讨论C语言的崛起时,讲到了内存管理方面我说所有指针使用前都必须初始化,结构体中的成员指针也是一样有人反驳说,不是吧,以前做二叉树...
  • 结构体指针指向的变量成员值的改变影响对应的实参构体变量成员值的改变 代码 直接说有些抽象难懂,敲代码演示一遍就很清楚了 #include <stdio.h> #include <stdlib.h> #include <string.h> ...
  • c语言结构体指针->基本使用

    千次阅读 2021-03-03 11:02:09
    基本用法 “->”是一个整体,它用于指向结构体子数据的指针,用来取子数据。 换种说法,如果我们在C语言中定义了一个结构体,... //声明结构体指针p struct temp A={1,2,3}; //声明结构体变量A int x; p=&A
  • (不清楚可以自己sizeof)所以我们并没有开辟出一个结构体的空间,你只能新建一个结构体(正常的struct time x或者使用malloc),然后把结构体的地址赋值给p,它才能够正常运行。如果想要开辟出空间,建议直接使用 malloc...
  • 第一种写法:(*a).p=&b;.的优先级高于*,(*pointer)两边的括号不能少。...是一个新的运算符,习惯称它为“箭头”,有了它,可以通过结构体指针直接取得结构体成员;这也是->在C语言中的唯一用...
  • 1.首先定义一个结构体,给它取别名:typedef struct node{struct node * ...定义结构体指针与指针变量,给出几种不同的定义方式struct node *a,b;pnode *c,d;linklist p;他们别名的关系如下:linklist=struct nod...
  • printf("*ptr->name = %c\n", *ptr->name); printf("*ptr->name++ = %c\n", *ptr->name++); printf("*ptr->name = %c\n", *ptr->name); printf("ptr->score = %d\n", ptr->score); printf("ptr->score++ = %d\n", ...
  • #include<stdio.h> typedef struct student { int sno; float score; }stu; int main() { float a = 0.3; stu li = { 1,98.2 }; stu* p = &li; float* q = &a; printf("%d\n", p->... .
  • C语言结构体指针陷阱

    2021-05-22 13:44:47
    一、“.”和“->”区别:当声明一个结构体时,因为自动分配...但如果声明的是一个结构体指针,则需要手动开辟一个结构体内存后,将这个指针指向该内存块后,再使用“->”进行内部变量访问,同时 (*o).value 等...
  • c语言结构体指针作为方法入参简单示例
  • 总结CSS3新特性&lpar;选择器篇&rpar;CSS3新增了嗯- -21个选择器,脚本通过控制台在这里运行; ~: p ~ p { color : red;/*此条规则将用于p后边所有的p......comma;入口文件下的准备工作yii流程 一 目录文件 |-...
  • C语言结构体指针 删除函数 为什么删除后会显示0? 麻烦各位大神速度指点一下~~答案:2信息版本:手机版解决时间 2019-10-06 06:27已解决2019-10-05 23:56void Delete() //删除信息函数{FILE *fp;fp=fopen("student....
  • C语言开发中,结构体用到的机会很多。所谓结构体,就是定义一种里面包含多种元素的变量。我们来看一个简单的例子。比如你想定义一个书名列表然后为每本书创建书名和作者作为书的信息。结构体变量定义如下:struct ...
  • C语言结构体指针赋值

    千次阅读 2021-05-21 07:53:44
    C语言结构体指针赋值》由会员分享,可在线阅读,更多相关《C语言结构体指针赋值(6页珍藏版)》请在人人文库网上搜索。1、指向结构体的指针 在C语言中几乎可以创建指向任何类型的指针,包括用户自定义的类型。...
  • C语言结构体结构体指针的简单用法 这里总结一下自己的学习笔记,关于C语言当中的结构体指针的用法,以及结构体简单使用。 简单介绍一下今天出场的嘉宾–>结构体和结构体指针 什么是结构体: 1,定义多种类型的...
  • 定义结构体指针:Seq *s;或者llink t;之后关于s与t的用法,其实完全一样,只是在定义时不同,Seq *就相当于llink了以为定义完指针以后就可以使用了吗?NO!需要为指针申请空间才能正常使用,否则会在输入这里出现很...
  • C语言结构体结构体指针的使用 tips:最近要好好学习一下数据结构,所以必不可少的就是c语言的结构体和结构体指针了,所以就整理一下这些基础知识 c语言结构体(struct)是由一系列具有相同类型或不同类型的数据...
  • 该楼层疑似违规已被系统折叠隐藏此楼查看此楼在函数中对结构体赋值时赋不上,用printf查看结果始终为0,有人说是因为结构体指针使用前没有进行实例化导致。一知半解没明白什么叫实例化,好像是要用malloc分配内存。...
  • 一、结构体的定义struct student{ //struct 结构体名long studentID; //数据类型 成员名1char studentName[10]; //数据类型 成员名2int scoreMath; //数据类型 成员名3};二、结构体变量的定义1先声明结构体模板,再...
  • 学习一下,保证自己的基础,边学边记录是个很好的习惯,以后回头来看看,就马上能了解了第一个程序是:C语言结构体指针用法,包括malloc和free的用法#include "stdafx.h"#include #include using namespace std;...
  • 1、结构体到结构体指针之间的转换a、结构体指针的强制类型转换即结构体的数据成员在内存段当中的重新分配,结构体的存储“内存对齐”请参看上篇博客,该论述实例如下:#include #include struct A{int num;...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 227,078
精华内容 90,831
关键字:

c结构体指针