数组没有"\n"结束输出问题、malloc在数组的应用、数组总结

一维数组:
1、初始化:char buf[5] = "hello";    和 char buf1[] = "world";编译器自动计算数组大小。
    区别:前者buf[5] = "hello"该方式不是字符串, 而是字符数组, 因为没有\0;char buf1[] = "world"是以\0在后面作为结束。
2、字符串的赋值:
    给 char* 类型的字符串赋值,可以直接使用 "=" 号
    给 char[] 类型的字符串赋值,需要使用 strcpy 函数
3、    malloc申请使用堆内存的步骤:
    int *pbuf=(int *)malloc(sizeof(int *)*5);
    memcpy(pbuf,bufint,(sizeof(bufint)));
    printf("pbuf=%d\n",pbuf[4]);
 

void fun1(void)
{
	char buf[5] = "hello";	
	char buf1[] = "world";
	printf("buf=%c\n",buf[2]);	//l
	printf("buf1=%s\n",buf1);	//world
	int bufint[5] = {1,29,365,4141,50000};
	printf("bufint=%d\n",bufint[4]);
	
	//使用malloc来为一维数组申请堆内存的方法
	int *pbuf=(int *)malloc(sizeof(int *)*5);
	memcpy(pbuf,bufint,(sizeof(bufint)));
	printf("pbuf=%d\n",pbuf[4]);
}

/****************************************************************************************************************************************************/
多维数组的初始化方式:
    1、bufchar[5][4] = {{"acda"},{"grsa"},{"yrtw"},{"olyh"},{"yevb"}};使用{}
    2、char bufchar[5][4] = {"acda","grsa","yrtw","olyh","yevb"};直接赋值

二维数组输出问题:
    1、在代码中二维数组bufchar和BUF中间如果没有"\0"结束标志,那么输出结果将会在bufchar输出结束的后面紧跟着输出BUF里面的全部内容。
    
    2、原因:bufchar输出结束并没有结束标志位。数组是临时变量,放在栈上面,他们的内存是紧接着的。
        解决办法:
        a、可以将unsigned char bufchar[5][4] = {{"acda"},{"grsa"},{"yrtw"},{"olyh"},{"yevb"}};改为unsigned char bufchar[6][4] = {{"acda"},{"grsa"},{"yrtw"},{"olyh"},{"yevb"},{"\0"}};
        b、将BUF与bufchar的位置互换
        c、在BUF和charbuf中间加上一个unsigned char zero[5][4] = {"\0"};
        d、使用malloc分别分配内存。
    上面四中办法可以正确输出buf[1]的内容
    
    4、使用堆内存、并初始化
    unsigned char (*bufchar)[4]=(unsigned char(*)[4])malloc(sizeof(unsigned char)*5*4);    //使用数组指针的办法
    初始化不能像平常的二维数组一样,集体使用{}后者""来初始化,编译会报错。
    我们采用堆内存申请多维数组后,可以最常用的一个个赋值,或者采用memcpy(&bufchar[0],"acda",4);函数来赋值。这点很重要。因为要操作的是一个指针。
    
    3、可以使用memcpy进行二维数组的重新赋值、改变。
     memcpy(&bufchar[2][0],"hhhh",4); 将bufchar[2][0]开始的四个字节改为hhhh。
 

void fun2(void)
{	//malloc堆内存来操作二维数组
	//unsigned char (*bufchar)[4]=(unsigned char(*)[4])malloc(sizeof(unsigned char)*5*4); 
	//(*bufchar)[4] = {"acda","grsa","yrtw","olyh","yevb"};
	//memcpy(&bufchar[0],"acda",4); 
	//memcpy(&bufchar[1],"grsa",4); 
	
	
	unsigned char bufchar[5][4] = {{"acda"},{"grsa"},{"yrtw"},{"olyh"},{"yevb"}};
	unsigned char zero[5][4] = {"\0"};
	unsigned char BUF[5][4] = {"ada1","dss1","e5yh","f3ts","ghsd"};
	
	
	 printf("bufchar[0][1]=%c\n",bufchar[0][1]); //c
	 printf("bufchar[1][2]=%c\n",bufchar[1][2]); //s
	 printf("bufchar[1]=%s\n",bufchar[1]);
	 
	 memcpy(&bufchar[2][0],"hhhh",4);
	 printf("bufchar[1]=%s\n",bufchar[1]);
	 
	 printf("bufchar[1]=%p\n",&bufchar[1]);
	 printf("bufchar[1][0]=%p\n",&bufchar[1][0]);
	 printf("bufchar[1][0]=%p\n",&bufchar[1][1]);
	 printf("bufchar[1][0]=%p\n",&bufchar[1][2]);
	 printf("bufchar[1][0]=%p\n",&bufchar[1][3]);
	 
	 printf("BUF[0][0]=%p\n",&BUF[0][0]);
	 printf("BUF[1][0]=%p\n",&BUF[0][1]);
	 
	 printf("BUF[0][1]=%c\n",BUF[0][1]);	//d
	 printf("BUF[1][2]=%c\n",BUF[1][2]);	//s
	 
	 bzero(BUF,5);
	 memcpy(&BUF[1],"GOOD",1);
	 printf("BUF[1]=%s\n",BUF[1]);
}

主函数

int main(void)
{
	 fun1(); 
	 fun2();
	 
	 return 0;
}

执行结果:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值