c语言 data 0x1,关于在Xcode中C语言的一个小问题:0x1

Header.h中内容(文件名仅为示例):

#ifndef Header_h

#define Header_h

#include

#include

typedef struct listNode{

int data;

struct listNode* next;

}listNode,*list;

//若不用复制返回,则l的next会一直变成0x1.

//第一种解决办法是在主调函数中给l的next首先赋值成NULL

//另外一种办法就是在initlist中将next赋值成NULL,但复制该指针返回。

void initlist(list l);

void insertElement(list l,int i);

Header.c中内容(文件名仅为示例):

#include "Header.h"

void initlist(list l){

l = (list)malloc(sizeof(listNode));

if (!l) {

exit(-1);

}

l->next = NULL;

l->data = 0;

}

void insertElement(list l,int i){

if(!l)

exit(-1);

list p = l;

//如果不在外面将l的next赋值成NULL,则传参的时候next都会变成0x1

while((p->next) != NULL){

p = p->next;

}

list q = (list)malloc(sizeof(listNode));

if (!q) {

exit(-1);

}

p->next = q;

q->next = NULL;

q->data = i;

}

当传入l1分配空间时,传出的指针next值会变成0x1,而非里面赋值的NULL。

main.c文件中内容

#include "Header.h"

int main(void) {

list l1;

initlist(l1);

l1->next = NULL;//当传入l1分配空间时,传出的指针next值会变成0x1,而非里面赋值的NULL

l1->data = 0;

insertElement(l1, 40);

return 0;

}

就比如没有上面红色那一句,而相信initlist()函数会做好初始化工作,结果就是:

cef142e67d213699b3b1bc81ce630903.png

分析:

读到这里估计有人会发现感觉上面的注释分析是

“有道理的呢!”

还是

“有道理的呢?”

其实,上面的都是概念性的错误,对于指针理解偏颇造成的。

指针也是变量,存储变量地址,并不能说传入一个指针,就能让它带一个另外的地址出来。就像你传入一个整数,不能指望在一个函数中通过按值传递方式来改变这个整数。

运行至这里的时候,发现initlist函数初始化是正确的:

0b3c8609e50e7ea759857ddbd89fabb4.png

da56d7c15bb1feda568b63dc5cc0ea10.png

但是跳出这个函数到主函数时,list类型指针l没有传出来:

指针变量也是传递的值进去,和普通变量一样,而作为实参的外部指针按值传入后,并不能带出分配空间之后的指针地址,从而造成这样的情况,所以解决办法有两种:

1、将initlist函数设置一个返回值:

3bde05bad257825b70ca5afedcf5332e.png

89ff5883295a991e1ffe999416fe6e68.png

至此,一切正常

2、使用二级指针

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值