接上

    技术2022-05-11  60

    1. char *c1 = "abc"; 2. char c2[] = "abcd"; 3. char *c3 = ( char* )malloc(4); 4. c3 = "abc" 5. strcpy(c3,"1234"); 6. c3[0] = 'g'; 分析: 1。上面代码中的 字符串常量 "abc","abcd","1234",都是存放在所谓的文字常量区; 2。c1,c2,c3 这个三变量,都存放在栈中 3。在VC中测试,CPU4个字节对齐吧,EBP为栈顶指针 c1 的地址,就是ebp - 04h,占用4个字节 c2 的地址,就是ebp - 0ch,占用8个字节 c3 的地址,就是ebp - 10h,占用4个字节 4。存储内容比较 c1 的4个字节,保存是的字符串常量 "abc"的地址 c2 的8个字节,保存就是就"abcd/0"还有3个字节未用;它不保存字符串常量 "abcd"的地址,而是将内容复制过来 c3和c1一样,也是保存一个地址,但这个地址,是在堆中, 结论: 所谓c++中char * 和 char []的区别 char * 在栈中是4个字节的指针, 而 char []将在栈中申请合适的内存来保存初始化的数据, 也就是说 char c2[]="abcd"; 和char c2[5]="abcd";一样的; 若char c2[n],则在栈中分配n个字节; 所以c2[1]='0'是正确的,c1[1]='a'是错误的,因为字符串常量不允许修改; 同时也说明了上面的代码 ... char a=1; char c[]="1234567890"; char *p="1234567890"; a = c[1]; a = p[1]; ... a = c[1];要比a = p[1];快的原因,少了一条指令嘛  

    最新回复(0)