ROM / Stack

nhwang·2022년 2월 8일
0

GNL 도중
함수 내에서 동적할당을 쓰지 않은 채 선언하고 뒤에 그냥 붙힌다음 리턴하면 안될까? 라는 잔머리에서부터 의문 시작

  1. char str[1024]; (1024는 임의 수)
    선언하고 str++해주면서 *str = bf[0]으로 접근. 후 반환
    반환 자체를 막지는 않지만 ?등 특수 기호들이 막 나열된 값이 출력.
    이유 : 스택 영역에 선언되었기 때문에 반환한 str주소 자체가 날아가버리기 때문이다.

    1-2. 동일한 선언.
    접근을 *str=bf[0]이 아닌,
    str[index]=bf[0]으로 하였고 이걸 하면 아래의 오류가 나온다. 이거는 직접적으로 변경이 가능하기 때문에
    스택에서 소모될 이 영역을 막은 것으로 보인다.

    warning: address of stack memory associated with local variable 'answer' returned

  1. char str[]; >>> 공간 선언 안 해주어서 컴파일이 되지 않는다.

  2. char *str선언 후 str[i]=bf[0] >>>> 이런 접근은 허용되지 않는다. 인덱스 접근허용하는 선언이 아니기 때문이다.
    ㄴ>세그먼트 폴트 (어디까지가 문자열영역의 메모리인지 컴퓨터는 위의 선언으로 알 수 없다.)

1번 뻘짓에 의해, char *를 반환하는 함수를 무수히 많이 봐온 나로서는 다시 의문. (똑같아 보이는 동작이 선언에 따라 다름.)
ㄴ> char *str = "hello" 후 반환 시도했는데, 반환이 잘 되었다.

char *str="hello" VS char str[10] 후 str에"hello"집어넣기 의 근본적인 차이를 모르고 그냥 지나왔음을 자각.

char *str="~~~"
이거는 컴파일도 정상. 반환도 정상이다. 왜냐. 이것은 스택 영역에 들어가지 않기 때문이다.
ㄴ> Read Only Memory(ROM)에 들어가고 이것은 원문상으로는 전원이 꺼지기 전까지 유지된다는 것으로 나와있음.
어차피 다른 함수에서 접근하더라도 수정불가로 약속한 주소이니 주소를 날려버릴 필요가 없는 것이 이유일 것 같다.

그러면 str[10]으로 한 건 반환이 되냐? >>> 이거는 마찬가지로 날려버릴 스택의 주소이다.


ROM이 진짜 컴퓨터 전원종료 까지 유지되나 살펴보기 위해서 서로 다른 main에서 str의 주소를 찍고 같은 주소를 출력해보는 시도를했으나
이런 저런 시도를 해도 long을 담을 수 없다는 오류와 함께 컴파일 되지 않았다. 일단 이 부분은 고민이 너무 딥해질 것 같아
Keep.

1번과 1-2의 차이는 문자열 담는 방식의 차이인것 같은데, 이부분도 파 볼 필요성이 있다.
ㄴ> 혹은 리턴을 할 때 *로 접근하는 방식은 주소자체를 ++하므로 첫 주소를 다른 변수에 저장해 던지는데, 이것 또한 readonly라서 반환이 되는거라고 봐야하려나...?

profile
42Seoul

0개의 댓글