精华内容
下载资源
问答
  • C 结构体指针初始化

    千次阅读 2019-04-26 23:18:31
    原文 C 结构体指针初始化,CSDN同步发布。 转载请注明出处,谢谢! 在使用指针之前,务必要将其初始化。这个是我们最早学习 C 语言的时候,书上经常说的一个问题。在工作中,我们反而会经常忘记这条金科玉律。 本篇...

    原文 C 结构体指针初始化,CSDN同步发布。

    转载请注明出处,谢谢!


    在使用指针之前,务必要将其初始化。这是我们最早学习 C 语言的时候,书上经常说的一个问题。在工作中,我们反而会经常忘记这条金科玉律。

    本篇文章的所有代码都经 gcc-7 编译器编译过。关于在 macOS 中如何安装和使用 gcc,可以参考 GCC: Homebrew 安装 GCC 和 Binutils 这篇文章。

    强力推荐-不要错过,万一能帮助到自己呢?

    朋友做了一个关于 人工智能的教程,教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!点 这里 可以跳转到教程,对人工智能感兴趣的同学可以了解一下。

    结构体成员指针的初始化

    结构体成员指针的初始化,指的是初始化结构体中指针变量的成员。

    我们举个例子,下面是 Animal 的结构体。

    struct Animal {
        char *name; //指针成员
        int age;
        char info[200]; //字符数组
        struct Animal *nextAnimal; //指针成员
    };
    

    结构体 Animal 含有4个成员变量,其中 nameinfonextAnimal 是指针变量。

    写一段测试代码,如下:

    int main(int argc, const char *argv[])
    {
        struct Animal animal;
        
        printf("animal's name: %s, age: %i, info: %s\n", animal.name, animal.age, animal.info);
        
        return 0;
    }
    

    运行结果正常,终端输出如下:

    animal's name: (null), age: 0, info: 
    

    我们来验证一下 Animal *nextAnimal 在没有初始化的情况下,会不会有什么问题。

    int main(int argc, const char *argv[])
    {
        struct Animal animal;
        
        printf("animal's name: %s, age: %i, info: %s\n", animal.name, animal.age, animal.info);
        
        printf("animal.nextAnimal: %p\n", animal.nextAnimal);
        
        printf("animal.nextAnimal->name: %s, age: %i, info: %s\n", animal.nextAnimal->name, animal.nextAnimal->age, animal.nextAnimal->info);
        
        return 0;
    }
    

    程序编译没有问题,运行报错

    animal's name: (null), age: 0, info: 
    animal.nextAnimal: 0x1127fa036
    Segmentation fault: 11
    

    修改一下代码,初始化一下 animal.nextAnimal 这个指针,如下:

    int main(int argc, const char *argv[])
    {
        struct Animal animal;
        
        printf("animal's name: %s, age: %i, info: %s\n", animal.name, animal.age, animal.info);
        
        printf("animal.nextAnimal: %p\n", animal.nextAnimal);
        
        // 初始化指针变量
        animal.nextAnimal = (struct Animal *)malloc(sizeof(struct Animal));
        
        printf("animal.nextAnimal->name: %s, age: %i, info: %s\n", animal.nextAnimal->name, animal.nextAnimal->age, animal.nextAnimal->info);
        
        return 0;
    }
    

    再次编译重新运行,还是报错。还需要初始化 animal.nextAnimal->name 这个变量。

    int main(int argc, const char *argv[])
    {
        struct Animal animal;
        
        printf("animal's name: %s, age: %i, info: %s\n", animal.name, animal.age, animal.info);
        
        printf("animal.nextAnimal: %p\n", animal.nextAnimal);
        
        // 初始化指针变量
        animal.nextAnimal = (struct Animal *)malloc(sizeof(struct Animal));
        
        // 初始化 name 变量
        animal.nextAnimal->name = "cat";
        
        printf("animal.nextAnimal->name: %s, age: %i, info: %s\n", animal.nextAnimal->name, animal.nextAnimal->age, animal.nextAnimal->info);
        
        return 0;
    }
    

    编译运行,一切正常。

    animal's name: (null), age: 0, info: 
    animal.nextAnimal: 0x10f0f1036
    animal.nextAnimal->name: cat, age: 0, info: 
    

    通过上面的例子,结构体指针变量有些会给默认值,有些又不会给,所以都要初始化指针变量。
    修改一下代码,示例如下:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    struct Animal {
        char *name; //指针成员
        int age;
        char info[200]; //字符数组
        struct Animal *nextAnimal; //指针成员
    };
    
    int main(int argc, const char *argv[])
    {
        struct Animal animal;
        
        animal.name = "cat";
        strcpy(animal.info, "This is a cat.");
        printf("animal's name: %s, age: %i, info: %s\n", animal.name, animal.age, animal.info);
        
        printf("animal.nextAnimal: %p\n", animal.nextAnimal);
        
        // 初始化指针变量
        animal.nextAnimal = (struct Animal *)malloc(sizeof(struct Animal));
        
        // 初始化变量
        animal.nextAnimal->name = "cat";
        strcpy(animal.nextAnimal->info, "This is a cat.");
        
        printf("animal.nextAnimal->name: %s, age: %i, info: %s\n", animal.nextAnimal->name, animal.nextAnimal->age, animal.nextAnimal->info);
        
        return 0;
    }
    
    

    结构体指针的初始化

    指的是初始化结构体指针变量。

    int main(int argc, const char *argv[])
    {  
        struct Animal *ptAnimal;
            
        printf("ptAnimal's name: %s, age: %i, info: %s\n", ptAnimal->name, ptAnimal->age, ptAnimal->info);
        
        return 0;
    }
    

    编译运行报错:

    Segmentation fault: 11
    

    同样的道理,需要初始化指针变量。完成后的示例代码如下:

    int main(int argc, const char *argv[])
    {
        struct Animal *ptAnimal;
        
        // 初始化结构体指针
        ptAnimal = (struct Animal *)malloc(sizeof(struct Animal));
        
        ptAnimal->name = "dog";
        strcpy(ptAnimal->info, "This is a big dog");
        
        printf("ptAnimal's name: %s, age: %i, info: %s\n", ptAnimal->name, ptAnimal->age, ptAnimal->info);
        
        // 初始化结构体指针的成员指针变量 nextAnimal
        ptAnimal->nextAnimal = (struct Animal *)malloc(sizeof(struct Animal));
        ptAnimal->nextAnimal->name = "dog";
        strcpy(ptAnimal->nextAnimal->info, "This is a big dog");
        
        printf("ptAnimal->nextAnimal's name: %s, age: %i, info: %s\n",
               ptAnimal->nextAnimal->name, ptAnimal->nextAnimal->age, ptAnimal->nextAnimal->info);
        
        return 0;
    }
    

    完整示例

    main.c

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    struct Animal {
        char *name; //指针成员
        int age;
        char info[200]; //字符数组
        struct Animal *nextAnimal; //指针成员
    };
    
    int main(int argc, const char *argv[])
    {
        /// 验证结构体指针成员变量
        {
            struct Animal animal;
            
            animal.name = "cat";
            strcpy(animal.info, "This is a cat.");
            printf("animal's name: %s, age: %i, info: %s\n", animal.name, animal.age, animal.info);
            
            printf("animal.nextAnimal: %p\n", animal.nextAnimal);
            
            // 初始化指针变量
            animal.nextAnimal = (struct Animal *)malloc(sizeof(struct Animal));
            
            // 初始化变量
            animal.nextAnimal->name = "cat";
            strcpy(animal.nextAnimal->info, "This is a cat.");
            
            printf("animal.nextAnimal->name: %s, age: %i, info: %s\n", animal.nextAnimal->name, animal.nextAnimal->age, animal.nextAnimal->info);
        }
        
        /// 验证结构体指针
        {
            struct Animal *ptAnimal;
            
            // 初始化结构体指针
            ptAnimal = (struct Animal *)malloc(sizeof(struct Animal));
            
            ptAnimal->name = "dog";
            strcpy(ptAnimal->info, "This is a big dog");
            
            printf("ptAnimal's name: %s, age: %i, info: %s\n", ptAnimal->name, ptAnimal->age, ptAnimal->info);
            
            // 初始化结构体指针的成员指针变量 nextAnimal
            ptAnimal->nextAnimal = (struct Animal *)malloc(sizeof(struct Animal));
            ptAnimal->nextAnimal->name = "dog";
            strcpy(ptAnimal->nextAnimal->info, "This is a big dog");
            
            printf("ptAnimal->nextAnimal's name: %s, age: %i, info: %s\n",
                   ptAnimal->nextAnimal->name, ptAnimal->nextAnimal->age, ptAnimal->nextAnimal->info);
        }
        
        return 0;
    }
    

    编译

    gcc-7 main.c -o main
    

    运行

    ./main
    

    运行结果如下:

    animal's name: cat, age: 0, info: This is a cat.
    animal.nextAnimal: 0x0
    animal.nextAnimal->name: cat, age: 0, info: This is a cat.
    ptAnimal's name: dog, age: 0, info: This is a big dog
    ptAnimal->nextAnimal's name: dog, age: 0, info: This is a big dog
    

    Never give up~

    展开全文
  • C++结构体指针 常用用法及注意事项

    万次阅读 多人点赞 2018-08-20 10:00:14
    c++结构体指针,顾名思义就是指向结构体的一个指针,这篇博客作用是记录c++结构体指针的常用用法及我经常犯的一个错误。 定义结构体: struct My{ My *left; My *right; int val; My(){} My(int val):left...

    总述:

    c++结构体指针,顾名思义就是指向结构体的一个指针,这篇博客作用是记录c++结构体指针的常用用法及我经常犯的一个错误。

    定义结构体:

    struct My{
        My *left;
        My *right;
        int val;
        My(){}
        My(int val):left(NULL),right(NULL),val(val){}
    };
    

    一般结构体变量的访问方式:

    void test1(){
        My m;
        m.val = 1;
        cout<<m.val<<endl;
    }

    可见,结构体中的变量,可以直接通过点操作符来访问。

    而对于结构体指针而言:必须通过->符号来访问指针所指结构体的变量。

    void test2(){
        My m;
        m.val = 1;
        My *mm;
        mm = &m;
        cout<<mm->val<<endl;
    }

    注意事项:

    声明一个结构体指针记得初始化,一定要初始化,不初始化会出事(重要的事情说三遍)

    如下:

    void test3(){
        My *m;
        m->val = 1;
    }

    这份代码会报一个错:空指针访问异常,这是因为m这个指针还没有初始化,因此他没有内存空间,自然就不存在有val这个参数。正确打开方式:

    void test3(){
        My *m;
        m = new My(3);
        m->val = 4;
        cout<<m->val<<endl;
    }
    

    以上代码用new申请了内存空间。问题即可解决。

    展开全文
  • 常用的两种写法:以单链表为例 struct Node{ int val;...没有构造函数的初始化可以用大括号{}: Node node = {0,NULL}; 还有更直接的方式,也是我们最熟悉的方式:先声明,后赋值 Node node; node...

    常用的两种写法:以单链表为例

    struct Node{
    	int val;
    	Node *next;
    };
    
    tpyedef struct node{
    	int val;
    	node *next;
    }Node;
    

    初始化过程:

    没有构造函数的初始化可以用大括号{}:

    Node node = {0,NULL};
    

    还有更直接的方式,也是我们最熟悉的方式:先声明,后赋值

    Node node;
    node.val = 0;
    //node.next = NULL;//默认的无指向指针都指向空,此句可以省略
    

    来分析一下这其中的过程:第一句话是声明,又是定义,还顺便完成了初始化的过程,这三者在这里分的并不清楚。第二句话是赋值语句。
    这里面提到到四个操作其实并不一样:声明分定义型声明和引用型声明。定义只能有一个,而声明可以有多个,entern就用作引用型声明,我们最熟悉的int a;,就是定义型声明,通常我们说的声明一个变量a和定义一个变量a在这里是等价的。定义会分配内存,这里就是给a分配了内存,而内存中原本是存在数据的,内存的数据就会以int的形式解析出来,所以说顺便完成了初始化过程。其实这种初始化并不是我们需要的,而且我们一般也不认为这是初始化。当执行a = 0;时,才算完成了我们认为的初始化,实际上这里只是赋值语句,做的只是更改数据而已。如果你知道变量只能先初始化再赋值,初始化与赋值是两个完全不同的操作,这个问题就很好理解了。

    如果我们用指针来说,也可以解释上述说法:

    Node *node;
    node->val;
    

    这时候就会报错,提示node没有初始化。这就说明了赋值操作必须在初始化以后。很明显我们没有给node一个实际的指向,对没有确定指向的指针操作数据是及其危险的,编译器会阻止我们这么做。当然如果默认的无指向指针被系统设置为NULL,我们对空指针的操作也是意义不明的,所以对指针来说,就存在一个明显的初始化过程。我们加上一点内容,让node指向确定的内存区域,就可以通过编译并正确运行:

    Node *node = new Node;
    //等价于Node temp;Node *node = &temp;
    node->val;//再进行赋值就不会报错
    

    加入构造函数的写法(类):

    struct Node{
    	int val;
    	Node *next;
    	//Node(int _val): val(_val), next(NULL){};
    	Node(int _val){
    		val = _val;
    		next = NULL;
    	};
    };
    
    tpyedef struct node{
    	int val;
    	node *next;
    	//可以有默认参数
    	//Node(int _val = 0): val(_val), next(NULL){};
    	Node(int _val = 0){
    		val = _val;
    		next = NULL;
    		};
    }Node;
    

    初始化过程:

    Node node(0);
    //Node node();//针对构造函数有默认参数的情况
    
    //指针
    Node *node1 = &node;
    Node *node2(node1);
    Node *node3 = new Node(0);
    //Node *node3 = new Node();//针对构造函数有默认参数的情况
    
    展开全文
  • C,C++ ---结构体指针初始化

    千次阅读 2013-11-23 11:40:29
    结构体: struct ScatteredBullet { DoubleBullet *pBullet1; DoubleBullet *pBullet2; DoubleBullet *pBullet3...初始化: ScatteredBullet *pScatteredBullet = (struct ScatteredBullet*)malloc(sizeo

    结构体:

    struct ScatteredBullet
    		{
    			DoubleBullet *pBullet1;
    			DoubleBullet *pBullet2;
    			DoubleBullet *pBullet3;
    		};

    初始化:

    	ScatteredBullet *pScatteredBullet = (struct ScatteredBullet*)malloc(sizeof(struct ScatteredBullet));
    		DoubleBullet *pBullet1 = new DoubleBullet;
    		DoubleBullet *pBullet2 = new DoubleBullet;
    		DoubleBullet *pBullet3 = new DoubleBullet;
    		pScatteredBullet->pBullet1 = pBullet1;
    		pScatteredBullet->pBullet2 = pBullet2;
    		pScatteredBullet->pBullet3 = pBullet3;


    展开全文
  • 结构体指针初始化

    千次阅读 2013-10-09 15:10:51
    过了几天这位同事说他试了一下,结构体中的成员指针不经过初始化是可以用(左子树和右子树指针) 那时在忙着整理文档,没在意 今天抽空调了一下,结论是,还是需要初始化的。 而且,不写代码你是不知道原因的...
  • struct MyMsg { char* message; MyMsg() { const char* msg = "你好世界";... message = new char[strlen(msg)+1]; memset(message, 0, strlen(msg)+1); memcpy(message, msg, strlen(msg)); } }
  • 结构体指针为例,进行分析: struct stu{ int age; char name[3]; }; struct stu * mm; mm->age=10; mm->name=“ao”; 这样写会出问题,因为并没有对指针进行初始化!!! 更正: struct stu * mm=new ...
  • C++结构体指针引用

    2020-06-24 19:17:13
    文章目录类class结构体struct 类 class 定义:可以将变量打包在一起 privacy后面数组或者函数表示都是私有的只能在类里面调用,public表示在类外面和里面都可以公用 结构体 struct 结构体可以构造函数,内部可以写...
  • 两个常用的结构体数组、结构体指针 1、结构体数组 将自定义的结构体放入到数组中方便维护 语法:语法: struct 结构体名 数组名[元素个数] = { {} , {} , ... {} } 举例: struct student { //成员列表 ...
  • c语言结构体指针初始化 今天来讨论一下C中的内存管理。 记得上周在饭桌上和同事讨论C语言的崛起时,讲到了内存管理方面 我说所有指针使用前都必须初始化,结构体中的成员指针也是一样 有人反驳说,...
  • 声明并初始化 结构体指针 使用 连续分布 方法 func (reciver type) methodName([parameter list]) ([return list]){ body return value } 方法和函数的区别 1)调用方式不一样 函数的调用方式:函数...
  • #include  using namespace std; struct Student{ int id; Student *next; }*p,*head; void greate(){ head=new Student; head=NULL; p=head; cout int n; cin>>n;...p=new Stu
  • C++/Qt结构体初始化

    千次阅读 2019-10-15 10:11:59
    结构体初始化我们经常会用到,使用未初始化结构体,结果是不可预估的 下面介绍几种常用的结构体初始化方式: 1、结构体内分别初始化 typedef struct stTemp { int nName; int nType; char arrayTemp[50]; ...
  • c++指针初始化问题

    千次阅读 多人点赞 2018-12-13 11:47:18
    往往编译的时候可以通过,在程序运行的时候,就会出现异常,如果对程序不是很熟悉,则不是很容易找到问题所在,我最近就遇到过很多这样的问题,定义了一个结构体指针,使用的时候忘记初始化,导致在后边使用的...
  • struct Student { int age=0; string name="XiaoMing"; } int main() { Student st1; st1.age=10; st1.name="XiaoHong"; Student *st2=new Student; st2->...//new出来的结构体指针
  • 第一个值为指定的内存地址,块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作,其返回值为指向s的指针,它是对较大的结构体或数组进行清零操作的一种最快方法。 引入头文件 : < memory....
  • 结构体如下: Typedef structstudent { Int num; Char* name; } Tom,*Lily;   如果定义成Tom的形式,不需要为结构体分配内存,但是需要对name分配内存 Tom.name =(char*)malloc(sizeof(char)*n); 使用完毕...
  • new出来的对象用对应数据类型的指针接收——new运算符返回的是一个指向所分配类型变量(对象)的指针。对所创建的变量或对象,都是通过该指针来间接操作的; new一般使用格式(3种)【开辟单变量地址空间】: ...
  • 今天来讨论一下C中的内存管理。 记得上周在饭桌上和同事讨论C语言的崛起时,讲到了内存管理方面 ...过了几天这位同事说他试了一下,结构体中的成员指针不经过初始化是可以用(左子树和右子树指针) 那
  • 一个结构体变量的指针就是该...声明一个结构体变量,无论是否初始化,都开辟内存,声明一个结构体指针变量,对其初始化的时候才会开辟内存。 A a[3]; a是A型的,有3个,当然分配A乘3大小的空间 A* a; a是A*型
  • 在c语言中,定义一个结构体类型最好用上typedef这种方式,至于为什么?下面我们简单讲下。typedef struct point{int x;int y;}Point;在声明变量或定义变量的时候就可以像这样:Point p1;如果没有用typedef这个关键字...
  • int (*add)(int a, int b); 定义了一个函数指针add,它可以指向一个函数,这个函数有两个int类型参数,并返回一个int...结构体函数:(声明结构体函数,初始化结构体函数,调用结构体函数) #include<stdio.h&...
  • C++结构体数组 一个结构体变量中可以存放一组数据(如一个学生的学号、姓名、成绩等数据)。如果有10个学生的数据需要参加运算,显然应该用数组,这就是结构体数组。结构体数组与以前介绍过的数值型数组的不同之处...
  • 1. 结构体定义 结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。 结构体定义需要使用 type 和 struct 语句。struct 语句定义一个新的数据类型,结构体有中有一个或多个成员。type 语句设定了结构体...
  • 记得上周在饭桌上和同事讨论C语言的崛起时,讲到了内存管理方面我说所有指针使用前都必须初始化结构体中的成员指针也是一样有人反驳说,不是吧,以前做二叉树算法时,他的左右孩子指针使用时难道有初始化吗那时我...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 25,625
精华内容 10,250
关键字:

c++结构体指针new初始化

c++ 订阅