c语言指针必须初始化为空,C语言指针未初始化情况

本文分析了C语言中栈上和堆上内存分配的情况。栈上分配的变量如a初始值可能为“乱数”,指针p_int默认为0;结构体成员变量在未初始化时均为0。通过malloc在堆上分配空间,结构体成员值也为0。而使用malloc分配的连续内存,如arr,其元素值是随机的。在C语言中,0通常用于布尔运算的假值。讨论了不同编译器可能的行为差异,以GCC为例,其他编译器需单独验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include

#include

#include

typedef struct node Node,*P_Node;

struct node

{

int data;

P_Node next;

int *p2int;

};

int main(void)

{

int a;

int *p_int;

Node node;

P_Node p_node;

printf(" a=%d , p_int=%p ,\n Node.data=%d ,node.nex=%p , Node.p2int=%p\n", \

a,p_int,node.data,node.next , node.p2int);

printf("p_node=%p \n",p_node);

printf("&node=%p\n",&node);

p_node = (P_Node)malloc(sizeof(Node));

printf("=====after malloc the space!======\n");

printf("p_node=%p\n",p_node);

printf("p_node->data=%d p_node->next=%p\n" , p_node->data ,p_node->next);

printf("p_node->p2int=%p\n",p_node->p2int);

int *arr = (int*)malloc(sizeof(int)*3);

printf("arr[0..2] = %d ,%d,%d\n",arr[0],arr[1],arr[2]);

return 0;

}

输出结果:

a=32767 , p_int=0x0 ,

Node.data=0 ,node.nex=0x0  ,  Node.p2int=0x0

p_node=0x0

&node=0x7fff59f9fc50

=====after malloc the space!======

p_node=0x7fb8cb4038f0

p_node->data=0 p_node->next=0x0

p_node->p2int=0x0

arr[0..2] = -1951222467 ,32767,-1900194516

运行环境:

mac +gcc4.7

分析, 栈上由编译器开辟的空间,a初值为“乱数”,指针p_int为0。在栈上开辟的结构体,为初始化时,其成员变量无论原始类型或指针类型值都为0;

在堆上用malloc开辟的空间,成员变量值为0;开辟的连续空间,如   int *arr = (int*)malloc(sizeof(int)*3) 每一个元素值为“乱数”

分析这个问题的意义:  在C语言中布尔运算,0为假,非0为真。 故而有 while(p->next){...}这类写法。

注意,初值是0 还是“乱数” 完全由编译器决定, 上述讨论只限于 GCC, 对其他编译器需要验证。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值