将char[][] 赋值给char**的结果
来源:互联网 发布:u盘数据恢复文件乱码 编辑:程序博客网 时间:2024/06/05 18:24
网上一篇文章 char** 和 char[][]的问题引发的讨论, 这里做个笔记。
以下内容部分为网上引用整理。
#include <iostream>using namespace std;int output(char **buf){ printf(" buf address: %p\n",buf); printf("&buf[0] address: %p\n",&buf[0]); printf("&buf[1] address; %p\n",&buf[1]); printf("*buffer address: %p\n",*buf); printf(" buf[0] address: %p\n",buf[0]); printf(" buf[1] address: %p\n",buf[1]); printf(" *buf hex: %lx\n",*buf); printf(">>> %x%x%x%x%x%x%x%x\n", 'b',' ','a',' ','m','a',' ','i'); printf(">>> %lx\n",buf[0]); /** 错误 0的说明 * 函数内buf为二级指针,buf[0]类型char*,为指针,64位系统指针8字节, * 则buf[0]指针的值为buf所指内存单元向下共8个内存单元内容组成的值。 * 这8个内存单元内容是什么呢,就是从函数外buf[0][0]即字符'i'的地址 * 开始依次取八个字节得到的是'i am a b',将其转化为数值即为0x6d612069, * 故buf[0]的值为0x6d612069(注意little endian),printf(“%s\n”,buffer[0]),故发生地址越界。 * * 也就是相当于将char *p = "i am a bastard..." 强制转换为char **pp = (char**)p, * 然后取pp[0], pp[0]就是p的前8个字节。 */ /** * 错误 0: 执行这句会Crash */ //printf(">>> %s\n",buf[0]); printf("\n\n");}int main(){ char buffer[100][1024] = {0}; char *a = "i am a bastard..."; char *b = "hello world..."; int len1 = sprintf(buffer[0],a); int len2 = sprintf(buffer[1],b); buffer[0][len1] = '\0'; buffer[1][len2] = '\0'; /************** 0 ***************/ { printf(" buffer address: %p\n",buffer); printf(" buffer hex: %x\n",buffer); printf(" &buffer[0] address: %p\n",&buffer[0]); printf(" &buffer[1] address: %p\n",&buffer[1]); printf("&buffer[0][0] address: %p\n",&buffer[0][0]); printf("a address: %p\n",a); printf(" a string: %s\n",a); printf(" a hex: %lx\n",a); printf("buffer[0]: %s\n",buffer[0]); printf("buffer[1]: %s\n",buffer[1]); printf(" a hex: "); for (int i = 0; i < strlen(a); i++) { printf("%02hhx",a[i]); } printf("\n"); printf(" b hex: "); for (int i = 0; i < strlen(b); i++) { printf("%02hhx",b[i]); } printf("\n"); output((char **)buffer); } /************** 1 ***************/ { char *p[100]; for(int i=0;i<100;i++) p[i] = buffer[i]; output(p); } /************* 2 ***************/ { char *p[100]; char **pp = p; for(int i=0;i<100;i++) p[i] = buffer[i]; output(pp); } /************* 3 ***************/ { //c++ 替换为 char **pp = new char*[100]; char **pp = (char **)malloc(sizeof(char *) * 100); for(int i=0;i<100;i++) pp[i] = buffer[i]; output(pp); //c++ 替换为 delete[]pp; free(pp); }}
Result: buffer address: 0x7fff5c252c40 buffer hex: 5c252c40 &buffer[0] address: 0x7fff5c252c40 &buffer[1] address: 0x7fff5c253040&buffer[0][0] address: 0x7fff5c252c40a address: 0x103995e80 a string: i am a bastard... a hex: 103995e80buffer[0]: i am a bastard...buffer[1]: hello world... a hex: 6920616d206120626173746172642e2e2e b hex: 68656c6c6f20776f726c642e2e2e buf address: 0x7fff5c252c40&buf[0] address: 0x7fff5c252c40&buf[1] address; 0x7fff5c252c48*buffer address: 0x622061206d612069 buf[0] address: 0x622061206d612069 buf[1] address: 0x2e2e647261747361 *buf hex: 622061206d612069>>> 622061206d612069>>> 622061206d612069 buf address: 0x7fff5c252920&buf[0] address: 0x7fff5c252920&buf[1] address; 0x7fff5c252928*buffer address: 0x7fff5c252c40 buf[0] address: 0x7fff5c252c40 buf[1] address: 0x7fff5c253040 *buf hex: 7fff5c252c40>>> 622061206d612069>>> 7fff5c252c40 buf address: 0x7fff5c252600&buf[0] address: 0x7fff5c252600&buf[1] address; 0x7fff5c252608*buffer address: 0x7fff5c252c40 buf[0] address: 0x7fff5c252c40 buf[1] address: 0x7fff5c253040 *buf hex: 7fff5c252c40>>> 622061206d612069>>> 7fff5c252c40 buf address: 0x7fc220500000&buf[0] address: 0x7fc220500000&buf[1] address; 0x7fc220500008*buffer address: 0x7fff5c252c40 buf[0] address: 0x7fff5c252c40 buf[1] address: 0x7fff5c253040 *buf hex: 7fff5c252c40>>> 622061206d612069>>> 7fff5c252c40
0 0
- 将char[][] 赋值给char**的结果
- 将char* 赋值给std::string的一些陷阱
- const char * 赋值给 char*
- 【C++细节】char**赋值给const char**
- 将C++的std::string类型变量赋值给char类型数组
- CString赋值给char数组
- CString赋值给char数组
- CString赋值给char数组
- Char数组的赋值
- char* 之间的赋值
- 给结构里的char指针赋值的一个难点
- 含有空字符0的char 字符串给string赋值
- C++图像处理中从硬盘读入图像文件,并将相应数据赋值给图像类的char**data成员
- char或unsigned char给int赋值区别
- string变量赋值给char *p指针
- 用unsigned char 赋值给Mat
- 给char数组或者结构体赋值
- 用Qstring给char[]数组赋值
- zoj3892Available Computation Sequence(区间dp)
- LeetCode Best Time to Buy and Sell Stock IV
- .net中ImageField绑定图片路径
- java 逆置 单链表
- hdu 5439 Aggregated Counting(找规律)
- 将char[][] 赋值给char**的结果
- Xcode添加常用的代码片段 (code sinppets)
- Python 学习(2)---基本知识整理
- 在Linux命令行下运行Matlab
- python 关键词记录
- oracle 部分文件作用
- 【ionic&AngularJS】用户头像压缩上传,按比例缩小。
- jQuery提交JSON文件至php网页,保存为文档文件
- jsp语法总结