昨天去笔试,考到了一些关于指针的题,觉得很有趣,想把它拿出来再做一次。很可惜的是,没意识要拍张照,
记不清全部题了。只能靠回忆,推猜了一下,写成一个程序的形式来表达。将就洛。。。
实践出真知,具体总结看函数的注释。在这里,要感谢论坛上帮助我解决问题的两个大哥,表示对指针的了解又
进了一步。好,不说废话,进入程序。
#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;
}