字符串都是定义在const段的,是可读不可写的。
当用char *a="abcde"; 时,只是简单的将一个指针指向它,你对指针的解除引用的写操作都是非法的;
当用char c[5]="abcde";时,是在堆栈中开辟了一个内存区,它是可读可写的,然后再将const段中的字符串复制过来,
最后用一个指针指向它(数组名?)。这时你可以对它写操作,但原来的字符串不会受影响。
:
char a[]="hello ";
mov
eax, DWORD PTR ??_C@_06PLNL@hello?5?$AA@
;定义在const中,"hello ",复制过程
mov
DWORD PTR _a$[ebp], eax
mov
cx, WORD PTR ??_C@_06PLNL@hello?5?$AA@+4
mov
WORD PTR _a$[ebp+4], cx
mov
dl, BYTE PTR ??_C@_06PLNL@hello?5?$AA@+6
mov
BYTE PTR _a$[ebp+6], dl
; 6
:
char* b="world!";
mov
DWORD PTR _b$[ebp], OFFSET FLAT:??_C@_06CBLJ@world?$CB?$AA@ ; `string';定义在const中,"world!"
从汇编的角度就很清楚