我们都知道,除了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;
}