1.
#include"stdio.h"
int main()
{
int a[5] = {1,2,3,4,5};
int *p1 = (int *)(&a + 1);
int *p2 = (int *)((int)a + 1);
int *p3 = (int*)(a + 1);
printf("%d\n%d\n%d\n",p1[0],p2[0],p3[0]);
return 0;
}
结果是:-1081069448
33554432
2
只有第三个打印是数组a中元素,说明&a是取的整个数组的首地址,再+1则超出数组的长度。第二个在数组a前加了强制类型转换,所以出错了。只有第三个是合法的。
2. 初级冒泡排序(malloc知识点)
#include"stdio.h"
#include"string.h"
#include"stdlib.h"
#define Size 5
void Sort(char *a[]) //初级冒泡排序
{
int i,j;
char *tmp;
for(i = 1;i<Size + 1;i++)
{
for(j = i+1;j<Size + 1;j++)
{
if(strcmp(a[i],a[j])>0) //比较a[i]与a[j]的ASSIC码值大小
{
tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
}
}
}
int main(int argc,char *argv[])
{
int i;
//int j;
//char *str[Size];// 定义一个指针型数组
/*for(j = 0;j<Size;j++)
{
str[j] = (char*)malloc(sizeof(char) * 20);//为每个数组元素分配空间
if(NULL==str[j])//判断分配是否成功
perror("Malloc");
scanf("%s",str[j]);
}*/
Sort(argv);//调用
for(i = 0;i<argc-1;i++)
{
//argv[i+1] = str[i];
printf("%4s ",argv[i+1]);
}
/*for(i = 0;i<Size;i++)//释放所有malloc分配的空间
{
free(str[i]);
}*/
return 0;
}
使用malloc后,最好加上if判断,malloc时否分配成功,用完后要用free释放掉。
3.
实现strcpy函数,其中一些知识重点。
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
char* mystrcpy(char *a,char *b)
{
char *tmp;
tmp = a;
if(a==NULL||b==NULL)
return NULL;
while((*a++=*b++)!='\0');//最后把'\0'复制过去再判断判
return tmp;
}
int main()
{
char*a = (char*)malloc(sizeof(char) * 20);//分配动态内存
char*b = (char*)malloc(sizeof(char) * 20);
if(NULL == a||NULL == b)
printf("Malloc Failure"); //判断是否分配成功
printf("Please input :\n");
scanf("%s %s",a,b);
mystrcpy(a,b);
printf("%s\n",a);
free(a); //释放a所在的内存空间
a = NULL; //防止成为野指针
free(b);
b = NULL;
return 0;
}