嗨,老铁,欢迎来到我的博客!

如果觉得我的内容还不错的话,可以关注下我在 segmentfault.com 上的直播。我主要从事 PHP 和 Java 方面的开发,《深入 PHP 内核》作者之一。

[视频直播] PHP 进阶之路 - 亿级 pv 网站架构的技术细节与套路 直播中我将毫无保留的分享我这六年的全部工作经验和踩坑的故事,以及会穿插着一些面试中的 考点难点加分点

周梦康 发表于 2016-03-24 1270 次浏览 标签 : C

免费领取阿里云优惠券 我的直播 - 《PHP 进阶之路》

一个指针,没有内存空间来存储值,不能直接给他赋值

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

int main(int argc, char const *argv[])
{
	int *a;

	*a = 1; //Segmentation fault: 11 

	printf("%d\n", *a);

	return 0;
}

上面例子中a是一个指针,但是却没有说明a在内存中的地址,所以*a不能赋值。

使用malloc分配内存,然后赋值。

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

int main(int argc, char const *argv[])
{
	int *a;

	a = malloc(sizeof(int));

	*a = 10;

	printf("%d\n", *a);

	return 0;
}

如果只传递一个指针给函数,然后在函数内部给传入的指针副本分配内存并赋值。该操作对外面的变量是无效的。

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

void buf(int *a);

int main(int argc, char const *argv[])
{
	int *a;

	buf(a);

	*a = 11; // Segmentation fault: 11

	printf("%d\n", *a); 

	return 0;
}

void buf(int *a)
{
	a = malloc(sizeof(int));

	// *a = 11;
	// printf("%d\n", *a);
	// 这里仅仅是传入指针变量的一个副本,并不指向同一地址
}

使用二级指针

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

void buf(int **a);

int main(int argc, char const *argv[])
{
	int *a;

	buf(&a);

	printf("%d\n", *a);// 11

	return 0;
}

void buf(int **a)
{
	*a = malloc(sizeof(int));
	**a = 11;
}

或者

int main(int argc, char const *argv[])
{
	int *a;

	buf(&a);

	*a = 12;

	printf("%d\n", *a);

	return 0;
}

void buf(int **a)
{
	*a = malloc(sizeof(int));
}


嗨,老铁,欢迎来到我的博客!

如果觉得我的内容还不错的话,可以关注下我在 segmentfault.com 上的直播。我主要从事 PHP 和 Java 方面的开发,《深入 PHP 内核》作者之一。

[视频直播] PHP 进阶之路 - 亿级 pv 网站架构的技术细节与套路 直播中我将毫无保留的分享我这六年的全部工作经验和踩坑的故事,以及会穿插着一些面试中的 考点难点加分点

评论列表