char names[] = "ABCDE"; char names[6] = {"A","B","C","D","E","\0"}; printf("%s\n",arr);
printf("%s\n",names);
结果没有区别 %s:打印一个字符串,直到内存为0为止。
复习:内存分布图
代码区 :代码
栈 :参数、局部变量
全局变量 :全局变量可读可写 初始化,不初始化
常量区 :常量区 可读不可写
char* x = "china"; 常量 char y[] = "china"; 全局区变量 void Function(){ x="abc";//x地址可改 *(x+1)="A";//x指向的字符串不能修改 c000005 地址访问错误 x存的是"china"的首地址,x可改,x指向的"china"不可改.因为"china"在常量区。 y[1]="A";//修改h 可以修改 全局区变量 } void Function(){ 40空间 char* x ="china"; 44空间 存的是"china"的首地址,x可改,x指向的"china"不可改.因为"china"在常量区。 dword ptr [ebp-4],offset string "china"(0042201c) // 0042201c值:63 68 69 6e 61 00 00 00 char y[]="china"; 常量区拷贝进堆栈 单独48空间,加上面52空间 mov eax,[string"china"(0042201c)] eax,存的6e696863 mov dword ptr [ebp-8],eax mov cx,word ptr[string"china"+4(00422020)] cx,存的61 mov wod ptr [ebp-4],cx
自动补齐所以用了8个字节最后存进内存
*(x+1) = 'A';//直接修改常量区不可以,修改失败。
y[1]='A'; //拷贝进堆栈,可以修改
}