嵌套结构中的指针在c中不是NULL

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了嵌套结构中的指针在c中不是NULL相关的知识,希望对你有一定的参考价值。

我的这段代码有一个奇怪的输出。

代码:

#include <stdio.h>
#include <stdlib.h>


typedef struct _list1{
    char *str;
    struct _list1 *next;
} list1;

typedef struct struct1{
    char* str;
    list1* l;
}struct1;

typedef struct struct2{
    char* str;
    union{
        struct1 s;
    }extra;
}struct2;


int main()
{

    struct2 *d;
    if(d==NULL){
        printf("d is null
");
    }else{
        printf("d not null
");
    }
    d = (struct2*)malloc(sizeof(struct2));
    if(d==NULL){
        printf("d is null
");
    }else{
        printf("d not null
");
    }
    if(d->str==NULL){
        printf("d is null
");
    }else{
        printf("d str not null
");
    }
    if(((d->extra).s).str==NULL){
        printf("d extra s str is null
");
    }else{
        printf("d extra s str not null
");
    }
    if(((d->extra).s).l==NULL){
        printf("d extra s l is null
");
    }else{
        printf("d extra s l not null
");
    }

    return 0;
}

结果是:"为什么d(指针)不是空的?

d not null
d not null
d str not null
d extra s str not null
d extra s l not null

为什么d(指针)不是空的,而我没有得到的是为什么我的列表(l)的头或任何一个头在使用malloc后不是空的(甚至在malloc前强制d=NULL),我的意思是,我没有直接给头或str指针分配内存。

而当我用在线C编译器编译同样的代码时,"https:/www.onlinegdb.comonline_c_compiler"我得到的这个结果和我用电脑得到的结果完全不同。

d is null                                                                                                                                                                                   
d not null                                                                                                                                                                                  
d device type is null                                                                                                                                                                       
d extra s str is null                                                                                                                                                                       
d extra s l is null 
答案

第一件事是....

为什么要先做 d 动态分配后不是空的?

因为动态分配后的d是指向malloc新生成的内存地址的...

2- 来到另一个部分,如果你编译上面的程序,编译器可能会使用默认的 "动态分配"。NULL 初始化与否取决于编译器,因为在我的编辑器中,同样的代码提供了同样的结果,而你的GDB编译器则提供了同样的结果......更好的做法是将指针初始化到 NULL 而不是依靠编译器来避免这些歧义......。

例如

struct s{
  char *ptr;
};

int main(){
   struct s s1;
   if(s1.ptr == NULL) cout<<1;
}

我的编译器的输出是1;

以上是关于嵌套结构中的指针在c中不是NULL的主要内容,如果未能解决你的问题,请参考以下文章

C 语言结构体 ( 结构体中嵌套二级指针 | 为 结构体内的二级指针成员 分配内存 | 释放 结构体内的二级指针成员 内存 )

C语言 NULL赋结构体指针变量

C 语言结构体 ( 结构体中嵌套一级指针 | 分配内存时先 为结构体分配内存 然后再为指针分配内存 | 释放内存时先释放 指针成员内存 然后再释放结构头内存 )

C语言提高:结构体嵌套一级指针

C语言提高:结构体嵌套一级指针

如何使用指针来使用嵌套结构中的结构成员?