<!----><!---->
<!---->
C
语言中字符数组的存储
程序片段
:
void mstrcat(char *s, char *t)
{
s += strlen(s);
for(;*t!='\0';*s++=*t++);
*s = '\0';
}
这是一个字符数组连接的函数
.
(一)在测试程序中声明如下
:
char a[] = "abcd";
char b[] = "ef";
char s[] = "ghijklmnopqrstuvwxyz";
char *c;
char *d;
mstrcat(b, s);
/* 连接后的b */
printf("after:%s\n", b);
/* a */
printf("after:%s\n", a);
/* 各字符数组的首元素地址 */
printf("%d\n", (int)a);
printf("%d\n", (int)b);
printf("%d\n", (int)s);
分别在GCC3.4.4和VC6.0后,得出2种不同的结果:
GCC:
after:efghijklmnopqrstuvwxyz
after:uvwxyz
22ccd0
22ccc0
22cca0
得出结论(无异常产生):
每个字符按一个字节存储,并且相邻字符数组按照地址下降来存储,而一个数组内元素按照地址上升来存储.
GCC依照16个字节对齐原则进行对齐处理(即不足16个字节的数组,按16个字节进行对齐存储)
VC6.0:(出现异常)
after:efghijklmnopqrstuvwxyz
after:ijklmnopqrstuvwxyz
1245048
1245044
1245020
得出的结论:
VC6.0:
每个字符按一个字节存储,并且相邻字符数组按照地址下降来顺序存储
,而一个数组内元素按照地址上升来存储.
VC6.0依照4个字节对齐原则进行对齐处理(即不足4个字节的数组,按4个字节进行对齐存储)
总结:
总之,这种处理方式是种不安全的处理方式,是否出现异常取决于是否有足够的已申请空间的支持.
在GCC中未出现异常是因为GCC按照16字节的对齐方式,即32字节足以容纳连接后的字符数组b.
而在VC中出现异常是因为VC按照4字节的对齐方式,4字节不能容纳b.
可预见的是:如果当b的字符数组长度大于32时,GCC中也会出现异常.
(二)在测试程序中声明如下
:
同样在测试程序中如果声明如下
char *c;
char *d;
c = "abcd";
d = "efghi";
printf("%d\n", (int)c);
printf("%d\n", (int)d);
mstrcat(c, d);
printf("%s\n", c);
那么,在GCC和VC(版本同上)中的结果如下:
GCC(出现异常):
402000
402005
得出结论:
对于未指定所指对象的指针,其地址是编译器任意指定的,而当指定其所指对象时,指针则存储的是所指对象的首地址(例如,指针c指向的是字符数组"abcd"的首 地址),由于字符数组之间顺序存放,所以d指向的是5个字节("abcd"占用5个字节存储空间)后的位置,这里我们的看到的地址是升序的.
VC(出现异常):
4333604
4337624
得出结论:
对于VC而言,其相邻指定给指针的字符数组并非顺序存储,但指针指向的位置仍然是所指对象的首地址.
出现异常的原因是:
显然对于d字符数组所需要的连续存储空间c是不满足的(不能操作未申请的存储空间).
ps.
在(一)中,即使使用c语言的标准字符串函数strcat,strcat(b,s)也会出现异常,可见标准函数也没有使用重新申请新空间的方式处理.
分享到:
相关推荐
在C语言中,字符数组是存储字符串的基本方式。字符数组的操作是C编程中不可或缺的一部分,因为C语言不提供内置的字符串类型,而是通过字符数组来处理字符串。本篇将深入探讨C语言中字符数组操作的一些关键函数实现,...
当需要将浮点数转换为字符数组以供显示或存储时,如果不慎使用了标准库函数,可能会意外地增加程序大小,这在资源受限的嵌入式环境中是不被允许的。因此,开发一种不调用库函数的浮点数到字符数组的转换方法是十分...
### C语言字符数组初始化详解 #### 一、字符数组的定义与初始化 在C语言中,字符数组是一种非常重要的数据结构,主要用于存储一系列字符。字符数组的定义与初始化是掌握其使用的基础。以下是对字符数组定义及初始...
在C语言中,字符串实际上是由字符数组表示的,以空字符`\0`结束。例如,`char str[] = "Hello";`是一个包含6个字符的字符数组,包括结束的`\0`。 通过了解和实践以上知识点,你将能够有效地在C语言中使用数组进行...
C语言字符串数组是指以字符数组形式存储的字符串,在C语言中,字符串作为字符数组来处理。字符数组的初始化可以用逐个字符赋值的方式,例如`char str[10]={ 'I',' ','a','m',' ','h','a','p','p','y'};`,也可以用...
6.4 C语言字符数组和字符串 字符数组常用于存储字符串,因为C语言将字符串视为字符数组的特殊形式。字符串的结束标志是空字符 '\0'。例如,`char str[10] = "Hello"` 创建了一个包含5个字符(不包括结束符)的字符串...
在C语言中,字符串是一种特殊的字符数组,它们以空字符'\0'作为结束标识。本文主要探讨了C语言中字符数组的定义、初始化以及字符串的表示形式。 首先,字符数组的定义与初始化是通过声明一个字符类型(char)的数组来...
C语言字符数组与字符串的使用详解 C语言中,字符数组和字符串是两个紧密相关的概念。字符数组是指由多个字符组成的数组,而字符串则是指一个以`\0`结尾的字符序列。在C语言中,字符串可以看作是一个特殊的字符数组...
与几位童鞋交流了一下发现他们都把汉字单独拿出来了,只用数组存储的成绩,我觉得有点欠那么点意思,于是歪门邪道了一下,具体看下面的代码! #include stdio.h int main(){ char ach[16][64]={ // utf-8编码中会...
当需要在代码中直接表示二进制数据时,通常会将其转换为16进制字符串,以字符数组的形式存在。这样,数组中的每个元素对应于原始二进制数据的一个字节,用两个16进制数字表示。 该工具的工作原理可能包括以下步骤:...
在C语言中,字符数组可以是一维或二维数组,用于存储和处理字符串。字符数组的定义格式与数值数组一样,例如: char str[20]; // 一维字符数组 char country[10][20]; // 二维字符数组 二、字符数组的初始化 字符...
循环、数组、函数和指针是C语言中的四大核心概念,它们在程序设计中扮演着重要角色。以下是对这些主题的详细说明: 1. **循环**: - **for循环**:适用于已知循环次数的情况,包含初始化、条件判断和递增/递减部分...
【字符数组】是C语言中用于存储字符串的基本数据结构。字符串在C语言中实际上是字符数组,以`\0`(空字符)作为终止标志。字符数组的定义、使用、初始化和赋值是理解C语言字符串处理的关键。 1. **字符数组的定义**...
此外,C语言中的数组还包括多维数组、字符型数组、指针数组等多种类型。数组是C语言中的一种重要数据结构,对于程序设计和数据处理起着至关重要的作用。 C语言中的数组是一种重要的数据结构,它可以处理大量的数据...
本文将详细讲解字符数组与字符指针在C语言中的区别、用法,以及它们在实际编程中的应用场景。 首先,需要明确的是字符数组和字符指针在内存中存储的形式不同。字符数组在内存中是连续分配的,能够存储一系列字符,...
- **字符数组**:由字符类型的元素组成,通常用于存储字符串。 - **指针数组**:由指向不同类型数据的指针组成的数组。 - **结构数组**:由结构体类型的元素组成,可以包含多种不同类型的数据成员。 #### 三、一维...
在C语言中,可以使用`"..."`双引号来创建字符串字面量,它们会被自动存储为字符数组,并在末尾添加空字符。 接下来,我们讨论如何将字符数组转换为字符串。在C语言中,可以直接将字符数组视为字符串,只要确保数组...
在C语言中,字符串是零结尾的字符序列,可以被看作是字符数组。`'\0'`字符用于标记字符串的结束。字符数组可以用来存储和操作字符串,例如`strcpy`、`strcat`、`strlen`等函数用于字符串的复制、连接和长度计算。 ...
字符数组是一种特殊的数组,用于存储字符串数据。字符数组可以使用字符串函数,例如 strcpy、strcat、strlen 等,进行字符串的操作和处理。 三、排序算法 排序算法是数组操作中的一种重要算法,用于将数组元素按照...