변수를 선언 할 때 어떤 일이 일어나는지, 그리고 변수에 대한 데이터를 저장할 메모리가 어디에 있는지 살펴야합니다.
첫째, 단순히 쓰는 것은 무엇을 의미 하는가 :
이
char x = 42;
당신은 스택에 문자를 저장하기에 충분히 바이트를 얻고, 그 바이트, 42
둘째 값으로 설정하는 것을
char x[] = "hello";
당신이 스택에 6 바이트를 얻고, 그들이 문자 H, E, L, L, O, 값 0으로 설정됩니다 : 당신이 배열을 선언 할 때 발생합니다. 당신이 문자 포인터를 선언하는 경우
지금 무슨 일이 :
const char* x = "hello";
"안녕하세요"정적 메모리 어딘가에 저장하고, 충분한 바이트가 스택에 포인터를 얻을, 그 값에 대해 사용하는 바이트 문자열의 값을 보유하고있는 정적 메모리의 첫 번째 바이트 주소로 설정됩니다.
이제 두 번째 예와 같이 선언하면 어떻게됩니까? 정적 메모리, "a", "b"및 "c"에 저장된 세 개의 분리 된 문자열을 얻습니다.스택에서 세 포인터의 배열을 얻습니다. 각 포인터는 세 문자열의 메모리 위치로 설정됩니다.
첫 번째 예는 무엇입니까? 포인터의 배열에 대한 포인터를 원하는 것처럼 보입니다. 그러나 포인터의 배열은 어디로 갈 것입니까? 위의 포인터 예와 같습니다. 정적 메모리에 무언가를 할당해야합니다. 그러나 정적 메모리에서 2 차원 배열을 이와 같이 중괄호 초기화를 사용하여 선언 할 수없는 경우가 발생합니다. 함수 내에서 다음
const char* name_pointers[] = {"a", "b", "c"};
: 그래서 당신은 함수의 변수 외부로 배열을 선언하여 당신이 원하는 것을 할 수
const char** name = name_pointers;
는 "이 작동하지 않습니다"무엇을 의미합니까? 첫 번째 예제를 컴파일하고 실행할 때 어떤 일이 발생합니까? –
내 시스템에 이것은 seg 결함으로 이어질 것입니다. –
흠, 심지어 첫 번째 샘플을 컴파일 할 수 없습니다 – billz