首页 百科知识 指针不是数组

指针不是数组

时间:2022-09-22 百科知识 版权反馈
【摘要】:不幸的是,C要求我们为数组指定的大小是一个常数,因此无法确定r是否足够大。然而,很多C实现带有一个叫做malloc()的库函数,它接受一个数字并分配这么多的内存。首先,malloc()可能会耗尽内存,而这个事件仅通过静静地返回一个空指针来表示。而strlen()函数返回其字符串参数中所包含字符的数量,但不包括结尾的空字符。再加上检查malloc()是否成功,我们得到:

4.5 指针不是数组

    C程序通常将一个字符串转换为一个以空字符结尾的字符数组。假设我们有两个这样的字符串st,并且我们想要将它们连接为一个单独的字符串r。我们通常使用库函数strcpy()strcat()来完成。下面这种明显的方法并不会工作:

 

char *r;

strcpy(r, s);

strcat(r, t);

 

这是因为r没有被初始化为指向任何地方。尽管r可能潜在地表示某一块内存,但这并不存在,直到你分配它。

 

    让我们再试试,为r分配一些内存:

 

char r[100];

strcpy(r, s);

strcat(r, t);

 

这只有在st所指向的字符串不很大的时候才能够工作。不幸的是,C要求我们为数组指定的大小是一个常数,因此无法确定r是否足够大。然而,很多C实现带有一个叫做malloc()的库函数,它接受一个数字并分配这么多的内存。通常还有一个函数称为strlen(),可以告诉我们一个字符串中有多少个字符:因此,我们可以写:

 

char *r, *malloc();

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

strcpy(r, s);

strcat(r, t);

 

    然而这个例子会因为两个原因而失败。首先,malloc()可能会耗尽内存,而这个事件仅通过静静地返回一个空指针来表示。

 

    其次,更重要的是,malloc()并没有分配足够的内存。一个字符串是以一个空字符结束的。而strlen()函数返回其字符串参数中所包含字符的数量,但不包括结尾的空字符。因此,如果strlen(s)n,则s需要n + 1个字符来盛放它。因此我们需要为r分配额外的一个字符。再加上检查malloc()是否成功,我们得到:

 

char *r, *malloc();

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

if(!r) {

    complain();

    exit(1);

}

strcpy(r, s);

strcat(r, t);

 

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈