~cpp 
char t[] = "1234";
char *p = "5678";
char k[] = "123456";



.LC1:
    .string "5678"
.LC0:
    .string "1234"
.LC2:
    .string "123456";

// char t[] = "1234";
    movl    .LC0, %eax
    movl    %eax, -9(%ebp)
    movb    .LC0+4, %al
    movb    %al, -5(%ebp)

// char *p = "5678";
    movl    $.LC1, -4(%ebp)

// char k[] = "123456";
    leal    -19(%ebp), %edi
    movl    $.LC0, %esi
    cld
    movl    $7, %ecx
    rep
    movsb
// 마지막 k변수는 index 주소를 사용해 메모리를 목사하고 있다.
// 그렇다면 index로 메모리를 복사하는 것은 eax로 복사하는 것보다 느리다는 얘긴가?

사람들이 엉뚱하게 생각하는 가장 쉽고도 어려운 문제?

위의 경우 t는 조작 가능하지만 p는 조작 가능하지 않다.
왜냐하면 프로그램의 모든 것은 메모리로 올라간다. 즉, LC0, LC1은 프로그램의 일부로 데이터 영역에 올라간다.
포인터는 LC1을 가리키므로 메모리에 올려진 변하면 안되는 프로그램영역(CODE 영역)을 가리킨다.
하지만 배열(LC0)은 프로그램이 수행 되고 정의 부분이 되는 순간 LC0 영역의 데이터를 스택 영역에 복사한다.
즉, 배열은 CODE 영역의 포인터와 달리 스택영역에 존재하게 되므로 수정이 가능하게 되는 것이다.
Retrieved from http://wiki.zeropage.org/wiki.php/C/Assembly/포인터와배열
last modified 2021-02-07 05:22:47