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

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

#ifndef Header_h
#define Header_h

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

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文件中内容
<span style="font-size:24px;">#include "Header.h"

int main(void) {
    list l1;
    initlist(l1);
    <span style="color:#ff0000;">l1->next = NULL;</span><span style="white-space:pre">	</span>//当传入l1分配空间时,传出的指针next值会变成0x1,而非里面赋值的NULL</span>
<span style="font-size:24px;">    l1->data = 0;
    insertElement(l1, 40);
    return 0;
}
</span>

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

关于在Xcode中C语言的一个小问题:0x1_第1张图片


分析:

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

“有道理的呢!”

还是

“有道理的呢?”

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

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


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

关于在Xcode中C语言的一个小问题:0x1_第2张图片


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

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

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

关于在Xcode中C语言的一个小问题:0x1_第3张图片


至此,一切正常

2、使用二级指针


你可能感兴趣的:(mac,osx,xcode,C语言,0x1)