c语言也有“变长数组”(不只在c99语法中哦)

我们都知道,除了c99语法,其他c都应该不支持变长数组的创建。

可以看到这里直接创建变长数组,都不能编译通过。那为什么我说可以创建变长数组呢,接着看下去就知道了。

首先我们来理清几个概念

1:malloc()函数,查阅msdn可以知道

函数的声明:void *malloc( size_t size );

作用传递一个无符号整数过去,该函数会生成一个可以储存这样数目字符的空间。

但是根据定义,这个函数的返回值是一个指向void类型的指针。

所以我们需要对这个函数进行重新声明一下。

int main()
{
    char* malloc();
    char* r;
     return 0;
}

现在这个函数的返回类型改成了一个指向char类型的指针 。而且现在返回的这个指针中的地址,就是指向刚才所生成的那块可以放置相同数量字符的空间的首地址。

所以这里再定义一个同样指向char类型的指针

char *r

然后

r = malloc(strlen(s) + strlen(t) + 1);

//将malloc函数的返回值赋给r,那现在对r进行解引用就可以访问刚才生成的空间了

我们知道,数组的数组名就就是这个数组首元素的地址。那么在  r  被赋值后,就相当与创建了一个数组名为(*r),元素个数为刚才传参时的数值的字符数组。

这里我们可以调用监视窗口看到,数组名为(*r)的字符数组确实被创建了

 但是要注意:他开创的字符数组空间大小是我们传递过去的字符数目,而我们知道,在创建一个字符串时,系统会默认在字符串结尾放入一个'\0'的字符。所以我们需要在传参时加1,以便放置字符‘\0’.

 程序实现如下:

#include<stdlib.h>
#include<string.h>
//void *malloc( size_t size )
int main()
{
	//malloc函数,可以接收一个整数,然后分配一个
	//可以容纳这样数目字符的空间
	char* r, * malloc();
	char s[] = "student";
	char t[] = "i am a";
	r = malloc(strlen(s) + strlen(t) + 1);
	strcpy(r, t);
	strcat(r, s);
	printf ("     %s\n", r);
	return 0;
}

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值