C/C++ char数组存储字符串内存地址
问题描述:
#include <stdio.h> int main(void)
{
//program 6.3 Arrays of strings
char str2[][]; for(int i=;i<;++i){
for(int j = ;j<;j++){
str2[i][j]='a';
//printf("%p ", &str2[i][j]);
}
//printf("\n");
} for(int i=;i<;++i){
for(int j = ;j<;j++){ // 索引 j->12 printf("%c",str2[i][j] );
//printf("%p ",&str2[i][j]);
}
printf("\n");
}
return ;
}
运行结果:
aaaaaaaaaaaa
aaaaaaaaaaaa
aaaaaaaaaaNULNUL
显然代码第18行数组索引越界(java:IndexOutOfBoundsException),但程序编译运行通过,且越界索引对应的数组值补为a和NULL。

如上图所示, &numbers[][] = &number[][] + sizeof(number) / strnlen_s( number, sizeof(str));
即number[1][0]的地址等于number[0][4]的地址加上数组number的类型所占字节数(如int占4字节)。
通过打印数组每个元素地址观察得出原因
#include <stdio.h> int main(void)
{
//program 6.3 Arrays of strings
char str2[][]; for(int i=;i<;++i){
for(int j = ;j<;j++){
str2[i][j]='a';
}
} for(int i=;i<;++i){
for(int j = ;j<;j++){
printf("%c",str2[i][j] );
printf("%p ",&str2[i][j]);
}
printf("\n");
}
return ;
}
运行结果:
a0x7ffee509c710 a0x7ffee509c711 a0x7ffee509c712 a0x7ffee509c713 a0x7ffee509c714 a0x7ffee509c715 a0x7ffee509c716 a0x7ffee509c717 a0x7ffee509c718 a0x7ffee509c719 a0x7ffee509c71a a0x7ffee509c71b
a0x7ffee509c71a a0x7ffee509c71b a0x7ffee509c71c a0x7ffee509c71d a0x7ffee509c71e a0x7ffee509c71f a0x7ffee509c720 a0x7ffee509c721 a0x7ffee509c722 a0x7ffee509c723 a0x7ffee509c7 a0x7ffee509c7
a0x7ffee509c7 a0x7ffee509c7 a0x7ffee509c726 a0x7ffee509c727 a0x7ffee509c728 a0x7ffee509c729 a0x7ffee509c72a a0x7ffee509c72b a0x7ffee509c72c a0x7ffee509c72d NUL0x7ffee509c72e NUL0x7ffee509c72f
注意标注的两组彩色地址,想象中出现越界的str2[0][10]、str2[0][11]与str2[1][0]、str2[1][1]地址是一致的,故越界索引的数组值为a。即str2[0][10]==str2[1][0],str2[0][11]==str2[1][1]。
延伸
char str1[][] = {"AAAAAAAAAA","BBBBBBBBB","CCCCCCCCCC","DDDDDDDDD"}; //10个A
char str2[][] = {"AAAAAAAAAA","BBBBBBBBB","CCCCCCCCC","SSS"}; //9个A
编译报错 str1:initializer-string for array of chars is too long
C中的字符串总是由\0字符结束,所以字符串的长度永远比字符串中的字符数多1.
unsigned int count = ;
while (str1[count])
++count;
'\0'字符的ASCII码是0,对应于布尔值false。其他ASCII码都不是0,对应布尔值true。因此,只要str1[count]不是'\0',循环就继续执行。
#include <stdio.h> int main()
{ //program 6.3 Arrays of strings
//char str[][10] = {"AAAAAAAAAA","BBBBBBBBB","CCCCCCCCC","DDDDDDDDD"};
//char str2[][10] = {"AAAAAAA","BBBBBBBB","CCCCCCCC","SSS"};
char str2[][]; for(int i=;i<;++i){
for(int j = ;j<;j++){
str2[i][j]='a';
//printf("%p ", &str2[i][j]);
}
//printf("\n");
} for(int i=;i<;++i){
for(int j = ;j<;j++){
printf("%c",str2[i][j] );
//printf("%p ",&str2[i][j]);
}
printf("\n");
} return ;
}
输出结果:
1. aaaaaaaaaa
2. aaaaaaaaaa
3. aaaaaaaaaa
本文一开始使用测试程序使用for循环对数组对应索引进行赋值则没有使用'\0'做为结束标志,三个字符串间没有分隔标志,可以说它们并不是字符串而是单一的字符。
由于本人刚入门,文中不免有这样或者那样的错误,希望各位朋友们不吝赐教指正。
最后由于考研时间原因,列出此程序小弟还有的一处疑惑
#include <stdio.h> int main()
{
char str2[][]; for(int i=;i<;++i){
for(int j = ;j<;j++){
str2[i][j]='a';
}
} for(int i=;i<;++i){
for(int j = ;j<;j++){
printf("%c",str2[i][j] );
//printf("%p ",&str2[i][j]);
}
printf("\n");
}
return ;
}
运行结果:
aaaaaaaaaaaaaaa
aaaaaaaaaaaaaaa
aaaaaaaaaaNULNUL`QR
红色标记的字符经多次编译发现其字符会变动
再次编译结果:
aaaaaaaaaaaaaaa
aaaaaaaaaaaaaaa
aaaaaaaaaaNULNULDLEȜ
C/C++ char数组存储字符串内存地址的更多相关文章
- 结构体地址 字符串地址 数组地址 辨析 字符char是整型 内存地址
小结: 1.函数传参中,结构体不同数组,结构体是传值,指针和数组是传地址:2.随声明顺序,指针变量的内存地址从低到高,其他从高到低:3.char c[]字符数组,即数组的一种:char *c字符指针, ...
- C语言基础:指针类型与指针和数组、字符串的关系
//指针变量就是用来存储地址的,只能存储地址 格式: int *p; 这个p为指针变量:指针变量占8个字节 类型是用来说明这个指针指向的类型: 比如上边的int代表这个指针变量会指向int类型的 ...
- Delphi中的各种字符串、String、PChar、Char数组
参考博客:http://www.cnblogs.com/pchmonster/archive/2011/12/14/2287686.html 其中的所有代码均在Delphi7下测试通过. Delphi ...
- 【漏洞分析】两个例子-数组溢出修改返回函数与strcpy覆盖周边内存地址
修改返回函数 return 0 下面的程序的运行流程为main()函数调用了Magic()函数,通常执行完Magic()函数后会调用return 0 的地址, 但是在执行Magic()函数中时,数组下 ...
- 字符串(一):char 数组
字符串使用方法整理 系列: 字符串(一):char 数组 字符串(二):string 1. 声明 如下是一个例子(=> 表示表达式等价): char a[20] = "abcd&quo ...
- 为什么 char 数组比 String 更适合存储密码?
推荐阅读:5 个刁钻的 String 面试题! 另一个基于 String 的棘手 Java 问题,相信我只有很少的 Java 程序员可以正确回答这个问题. 这是一个真正艰难的核心 Java 面试问题, ...
- 为什么 char 数组比 Java 中的 String 更适合存储密码?
另一个基于 String 的棘手 Java 问题,相信我只有很少的 Java 程序员可以正确回答这个问题.这是一个真正艰难的核心Java面试问题,并且需要对 String 的扎实知识才能回答这个问题. ...
- 存储opline的内存地址可以实时跟踪opcode的执行
static intphp_handler(request_rec *r) { /* Initiliaze the context */ php_struct * volatile ctx; void ...
- 软件素材---linux C语言:拼接字符串函数 strcat的用例(与char数组联合使用挺好)
[头文件]#include <string.h> [原型] 1 char *strcat(char *dest, const char *src); [参数]: dest 为目标字符串指针 ...
随机推荐
- 滚动视图(ScrollView)的功能与用法
滚动视图ScrollView由FrameLayout派生而出,它就是一个用于为普通组件添加滚动条的组件.ScrollView里最多只能包含一个组件,而ScrollVew的作用就是为该组件添加垂直滚动条 ...
- Oracle 11gR2 RAC ohasd failed to start 解决方法
rcrCRS-4124: Oracle High Availability Services startup failed. CRS-4000: Command Start failed, or co ...
- Spinnerd的功能和用法
此处的Spinner其实是一个列表选择框.不过Android的列表选择框并不是需要下拉列表的,而是相当于弹出一个菜单供用户选择. Spinner和Gallery都继承了AbsSpinner,AbsSp ...
- PHP扩展之多线程
PHP一直以为不支持多线程,后面才知道有基于pThread的扩展包,地址如下: http://php.net/manual/zh/book.pthreads.php 我感兴趣的是以下几个点: 1.Th ...
- JSP EL表达式忽略方法
JSP EL表达式忽略方法: web.xml中,和jsp中:jsp中的等级要高一些: web.xml: <?xml version="1.0" encoding=" ...
- Bootstrap入门(八)组件2:下拉菜单
Bootstrap入门(八)组件2:下拉菜单 先引入本地的CSS文件和JS文件(注:1.bootstrap是需要jQuery支持的.2.需要在<body>当中添加) <link ...
- JAVA_file(1)
1.基本概念的理解 绝对路径:绝对路径就是你的主页上的文件或目录在硬盘上真正的路径,(URL和物理路径)例如:C:xyz est.txt 代表了test.txt文件的绝对路径.http://www.s ...
- 《浅谈架构之路:单点登录 SSO》
前言:SSO 单点登录 “半吊子”的全栈工程师又来了,技术类的文章才发表了两篇,本来想先将主攻的几个系列都开个头(Nodejs.Java.前端.架构.全栈等等),无奈博客起步太晚,写博文的时间又没有很 ...
- [UWP]附加属性1:概述
1. 什么是附加属性(attached property ) 附加属性依赖属性的一种特殊形式,常见的Grid.Row,Canvas.Left都是附加属性. /// <summary> // ...
- jquery实现横向导航
<!doctype html> <html> <head> <meta charset="UTF-8"> <title> ...