最近编写C程序发现一个问题, 传统教材里说的传址, 实际上并没有这回事, 是吗? 比如说
void print(int sum);
调用函数的时候函数内的sum是实参的一份复制(int sum = 实参), 但实际上, 即便是传递指针:
void print(int *sum);
也只是把指针复制了一份, 因此可以改变指针所指向的内容, 但是并不能改变作为实参的指针本身的内容, 是吗?例如:
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int num;
struct Node *next;
} Node;
void init(Node *p)
{
p = malloc(sizeof(Node)); /* Header */
p->num = 1;
p->next = NULL;
}
int main(void)
{
Node *p;
init(p);
printf("%d\n", p->num);
return 0;
}
这一段程序如果编译运行的话, 会core dumped, 就是因为在main函数执行完init(p)的时候init函数内的p是实参p的一份拷贝, 所以改变的实际上是拷贝版本, 最终导致printf的时候访问到了非法地址而造成的。这是我的猜想, 是这样子的吗?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.