`
topman
  • 浏览: 15719 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

C语言中字符数组的存储

阅读更多

<!----><!----> <!---->

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)也会出现异常,可见标准函数也没有使用重新申请新空间的方式处理.

 

2
0
分享到:
评论

相关推荐

    C语言中字符数组操作的函数实现(C语言实现)

    在C语言中,字符数组是存储字符串的基本方式。字符数组的操作是C编程中不可或缺的一部分,因为C语言不提供内置的字符串类型,而是通过字符数组来处理字符串。本篇将深入探讨C语言中字符数组操作的一些关键函数实现,...

    嵌入式C语言浮点数到字符数组转换.pdf

    当需要将浮点数转换为字符数组以供显示或存储时,如果不慎使用了标准库函数,可能会意外地增加程序大小,这在资源受限的嵌入式环境中是不被允许的。因此,开发一种不调用库函数的浮点数到字符数组的转换方法是十分...

    C语言字符数组初始化

    ### C语言字符数组初始化详解 #### 一、字符数组的定义与初始化 在C语言中,字符数组是一种非常重要的数据结构,主要用于存储一系列字符。字符数组的定义与初始化是掌握其使用的基础。以下是对字符数组定义及初始...

    C语言中的数组运算

    在C语言中,字符串实际上是由字符数组表示的,以空字符`\0`结束。例如,`char str[] = "Hello";`是一个包含6个字符的字符数组,包括结束的`\0`。 通过了解和实践以上知识点,你将能够有效地在C语言中使用数组进行...

    C语言字符串数组[参考].pdf

    C语言字符串数组是指以字符数组形式存储的字符串,在C语言中,字符串作为字符数组来处理。字符数组的初始化可以用逐个字符赋值的方式,例如`char str[10]={ 'I',' ','a','m',' ','h','a','p','p','y'};`,也可以用...

    C语言数组:C语言数组定义、二维数组、动态数组、字符串数组_C语言中文网1

    6.4 C语言字符数组和字符串 字符数组常用于存储字符串,因为C语言将字符串视为字符数组的特殊形式。字符串的结束标志是空字符 '\0'。例如,`char str[10] = "Hello"` 创建了一个包含5个字符(不包括结束符)的字符串...

    C语言字符串数组.pdf

    在C语言中,字符串是一种特殊的字符数组,它们以空字符'\0'作为结束标识。本文主要探讨了C语言中字符数组的定义、初始化以及字符串的表示形式。 首先,字符数组的定义与初始化是通过声明一个字符类型(char)的数组来...

    C语言字符数组与字符串的使用详解[归类].pdf

    C语言字符数组与字符串的使用详解 C语言中,字符数组和字符串是两个紧密相关的概念。字符数组是指由多个字符组成的数组,而字符串则是指一个以`\0`结尾的字符序列。在C语言中,字符串可以看作是一个特殊的字符数组...

    一道 C语言 二维数组作业题目

    与几位童鞋交流了一下发现他们都把汉字单独拿出来了,只用数组存储的成绩,我觉得有点欠那么点意思,于是歪门邪道了一下,具体看下面的代码! #include stdio.h int main(){ char ach[16][64]={ // utf-8编码中会...

    MP3文件转C语言16进制数组工具

    当需要在代码中直接表示二进制数据时,通常会将其转换为16进制字符串,以字符数组的形式存在。这样,数组中的每个元素对应于原始二进制数据的一个字节,用两个16进制数字表示。 该工具的工作原理可能包括以下步骤:...

    c语言中的字符数组与字符串[参考].pdf

    在C语言中,字符数组可以是一维或二维数组,用于存储和处理字符串。字符数组的定义格式与数值数组一样,例如: char str[20]; // 一维字符数组 char country[10][20]; // 二维字符数组 二、字符数组的初始化 字符...

    C语言循环、数组、函数及指针练习题精选及答案

    循环、数组、函数和指针是C语言中的四大核心概念,它们在程序设计中扮演着重要角色。以下是对这些主题的详细说明: 1. **循环**: - **for循环**:适用于已知循环次数的情况,包含初始化、条件判断和递增/递减部分...

    C语言教学课件:13-3_字符数组.ppt

    【字符数组】是C语言中用于存储字符串的基本数据结构。字符串在C语言中实际上是字符数组,以`\0`(空字符)作为终止标志。字符数组的定义、使用、初始化和赋值是理解C语言字符串处理的关键。 1. **字符数组的定义**...

    C语言中的数组ppt课件.ppt

    此外,C语言中的数组还包括多维数组、字符型数组、指针数组等多种类型。数组是C语言中的一种重要数据结构,对于程序设计和数据处理起着至关重要的作用。 C语言中的数组是一种重要的数据结构,它可以处理大量的数据...

    C语言中关于字符数组与字符指针

    本文将详细讲解字符数组与字符指针在C语言中的区别、用法,以及它们在实际编程中的应用场景。 首先,需要明确的是字符数组和字符指针在内存中存储的形式不同。字符数组在内存中是连续分配的,能够存储一系列字符,...

    C语言知识-数组非常经典的解释和介绍

    - **字符数组**:由字符类型的元素组成,通常用于存储字符串。 - **指针数组**:由指向不同类型数据的指针组成的数组。 - **结构数组**:由结构体类型的元素组成,可以包含多种不同类型的数据成员。 #### 三、一维...

    字符数组转换成字符串

    在C语言中,可以使用`"..."`双引号来创建字符串字面量,它们会被自动存储为字符数组,并在末尾添加空字符。 接下来,我们讨论如何将字符数组转换为字符串。在C语言中,可以直接将字符数组视为字符串,只要确保数组...

    C语言程序设计数组C语言程序设计数组C语言程序设计数组C语言程序设计数组C语言程序设计数组C语言程序设计数组C语言程序设计数组

    在C语言中,字符串是零结尾的字符序列,可以被看作是字符数组。`'\0'`字符用于标记字符串的结束。字符数组可以用来存储和操作字符串,例如`strcpy`、`strcat`、`strlen`等函数用于字符串的复制、连接和长度计算。 ...

    大一c语言数组实验心得.docx

    字符数组是一种特殊的数组,用于存储字符串数据。字符数组可以使用字符串函数,例如 strcpy、strcat、strlen 等,进行字符串的操作和处理。 三、排序算法 排序算法是数组操作中的一种重要算法,用于将数组元素按照...

Global site tag (gtag.js) - Google Analytics