嵌套结构中的指针在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 语言结构体 ( 结构体中嵌套一级指针 | 分配内存时先 为结构体分配内存 然后再为指针分配内存 | 释放内存时先释放 指针成员内存 然后再释放结构头内存 )