谈谈C语言指针那些陈年旧事

昨天去笔试,考到了一些关于指针的题,觉得很有趣,想把它拿出来再做一次。很可惜的是,没意识要拍张照,

记不清全部题了。只能靠回忆,推猜了一下,写成一个程序的形式来表达。将就洛。。。

实践出真知,具体总结看函数的注释。在这里,要感谢论坛上帮助我解决问题的两个大哥,表示对指针的了解又

进了一步。好,不说废话,进入程序。

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

void test1()
{
	char str[] = "hello world";
	printf("%s\n", str);	//输出hello world,中间的空格ASCII是32,char遇\0才终止
}

void test2()
{
	//申请一片内存空间
	char *str = (char*)malloc(12*sizeof(char));

	printf("str:%d\n", _msize(str)/sizeof(char));
	strcpy(str, "hello world");
	printf("%s\n", str);
	printf("str address:%p\n", str);
	free(str);

	/**
	  * 注意这里,free之后,str又重新变成随机值,故下面紧接着的
	  * 被注释掉的代码会编译出错,它已经不再指向之前申请的地址
	  * 空间了。
	  */
//	printf("%d\n", _msize(str)/sizeof(char));
	
	/** 
	  *	奇怪的是,这里输出的地址跟释放之前的地址一样,
	  *	于是就出现了“野指针”,这也是str!=NULL的原因。
	  * 故一般free之后,要将str指向NULL。
	  */
	printf("str address: %p\n", str);	
	if(str != NULL)
	{
		strcpy(str, "hello world");		
		printf("%s\n", str);	//我的编译器里,会正常输出hello world,但不建议这样用。
	}
}


void test3()
{
  /**	
	* 这里会报错,指针str只是指向了NULL,并没有分配内
	* 存空间,不能确定指针的长度,即strlen(str)的值无
	* 法确定,则执行strcpy(str, "hello")时会报错,因
	* 为strcpy的第一个参数空间比第二个小时,编译不通过。
	*/
	char *str = NULL;
	printf("%d\n", strlen(str));
	strcpy(str, "hello");
	printf("%s\n", str);
}

void test4()
{
	int i;
	char **p  = (char**)malloc(sizeof(char*) * 50);
	int sum = 0;
	for(i=0; i<50; i++)
	{
		p[i] = (char *)malloc(i+1);

		//注意这里,计算内存分配的大小,不能用strlen,因为没指定'\0'
		printf("p[%d]:%d\n", i, _msize(p[i])/sizeof(char));
		sum +=strlen(p[i]);
	}
	printf("sum: %d\n", sum);
	for(i=0; i<50; i++)
		free(p[i]);
	free(p);	//记住还要释放p,二维数组,跟p[i]不是一回事。
}

int main(void)
{
	test2();
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值