关于在Xcode中C语言的一个小问题:0x1
2016-03-24 20:44
459 查看
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"
当传入l1分配空间时,传出的指针next值会变成0x1,而非里面赋值的NULL。
main.c文件中内容
就比如没有上面红色那一句,而相信initlist()函数会做好初始化工作,结果就是:
分析:
读到这里估计有人会发现感觉上面的注释分析是
“有道理的呢!”
还是
“有道理的呢?”
其实,上面的都是概念性的错误,对于指针理解偏颇造成的。
指针也是变量,存储变量地址,并不能说传入一个指针,就能让它带一个另外的地址出来。就像你传入一个整数,不能指望在一个函数中通过按值传递方式来改变这个整数。
运行至这里的时候,发现initlist函数初始化是正确的:
但是跳出这个函数到主函数时,list类型指针l没有传出来:
指针变量也是传递的值进去,和普通变量一样,而作为实参的外部指针按值传入后,并不能带出分配空间之后的指针地址,从而造成这样的情况,所以解决办法有两种:
1、将initlist函数设置一个返回值:
至此,一切正常
2、使用二级指针
#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()函数会做好初始化工作,结果就是:
分析:
读到这里估计有人会发现感觉上面的注释分析是
“有道理的呢!”
还是
“有道理的呢?”
其实,上面的都是概念性的错误,对于指针理解偏颇造成的。
指针也是变量,存储变量地址,并不能说传入一个指针,就能让它带一个另外的地址出来。就像你传入一个整数,不能指望在一个函数中通过按值传递方式来改变这个整数。
运行至这里的时候,发现initlist函数初始化是正确的:
但是跳出这个函数到主函数时,list类型指针l没有传出来:
指针变量也是传递的值进去,和普通变量一样,而作为实参的外部指针按值传入后,并不能带出分配空间之后的指针地址,从而造成这样的情况,所以解决办法有两种:
1、将initlist函数设置一个返回值:
至此,一切正常
2、使用二级指针
相关文章推荐
- 如何组织构建多文件 C 语言程序(二)
- 什么是Mac OS X?跟Linux有什么区别
- mac下安装mysql(转载)
- mysql 修改编码 Linux/Mac/Unix/通用(杜绝修改后无法启动的情况!)
- 如何写好 C main 函数
- Linux vs Mac:Linux 比 Mac 好的 7 个原因
- 苹果mac OS X上安装metasploit
- Validation of viewstate MAC failed.的解决方法
- Lua和C语言的交互详解
- Mac平台中编译安装Lua运行环境及Hello Lua实例
- 在Mac OS中安装Lua的教程
- vbs Windows系统改变或修改网卡的MAC地址的脚本与软件第1/2页
- MAC官方菜单纯CSS实现灰色会换色
- mac系统OS X10.10版本安装最新5.7.9mysql的方法
- 在Mac OS下使用Node.js的简单教程
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解