c 언어 메모리

5568 단어 c
더 읽 기
1、
C 의 메모 리 는 다섯 개의 구역 으로 나 뉜 다.
창고: 함수 의 형 삼 과 함수 내의 국부 변 수 를 저장 합 니 다.컴 파 일 러 가 공간 을 분배 하고 함수 가 실 행 된 후에 컴 파 일 러 가 자동 으로 방출 한다.
더미: 동적 분배 함수 (예 를 들 어 malloc) 가 분배 하 는 공간 을 저장 합 니 다.프로그래머 가 직접 수 동 으로 배정 하고 프로그래머 가 free 로 풀 어야 합 니 다.만약 free 로 방출 하 는 것 을 잊 어 버 리 면 분 배 된 공간 이 계속 차지 하고 놓 지 않 아 메모리 가 유출 될 수 있다.
전역 국: 전역 변수 와 정적 변 수 를 저장 합 니 다.프로그램의 전체 운행 기간 에 존재 하 는 것 은 컴 파 일 러 가 분배 하고 방출 하 는 것 이다.
텍스트 상수 구역: 예 를 들 어 char * c = "123456";'123456' 은 문자 상수 로 문자 상수 구역 에 저 장 됩 니 다.컴 파일 러 가 분배 와 방출 을 제어 한다.
프로그램 코드 영역: 프로그램 을 저장 하 는 바 이 너 리 코드 입 니 다.
예 (1)


#include 
#include 
void main() 
{ 
    int b; //  
    char s[] = abc; //s  ,abc       
    char *p1,*p2; //  
    char *p3 = 123456; //123456    ,p3    
    static int c =0; //    
    p1 = (char *)malloc(10); //p1  ,   10     
    p2 = (char *)malloc(20); //p2  ,   20     
    strcpy(p1, 123456); //123456      
}   
 
예 (2)

#include 
#include 
char *f() 
{ 
    //s        
    //char s[4] = {'1','2','3','0'}; 
    char s[4] = "abcd"; 
    return s; //  s     ,      s        
} 
void main() 
{ 
    char *s; 
    s = f(); 
    printf("%s", s); //      。  s                                                                                                                   
} 
~  

예 (3)

#include 
#include 
char *f() 
{ 
    char* s = "abcd";                                                                                                                                                   
    return s; // abc        
} 
int main() 
{ 
    char *s; 
    s = f(); 
    printf("%s", s); //abc
} 

포인터 와 배열 의 차이 ★ ★ ★ ★ ★ ★
2、
동적 할당 메모리 방출
malloc 로 메모 리 를 동적 으로 분배 한 후 분배 가 성 공 했 는 지 판단 하고 포인터 의 값 이 NULL 인지 판단 해 야 합 니 다.
메모리 할당 이 성공 하면 메모리 셀 을 초기 화 해 야 합 니 다.
메모리 할당 이 성공 적 이 고 초기 화 된 후에 사용 할 때 경 계 를 넘 지 마 세 요.
메모리 사용 후 free (p) 로 방출 해 야 합 니 다. 주의 하 세 요. 방출 후 p 의 값 은 변 하지 않 습 니 다. 여전히 주소 값 입 니 다. 그 메모리 구역 을 가리 키 고 있 습 니 다. 다만 이 메모리 구역 의 값 은 쓰레기 가 되 었 습 니 다.이 메모 리 를 나중에 계속 사용 하 는 것 을 방지 하기 위해 서 는 free (p) 후 즉시 p = NULL 을 사용 해 야 합 니 다. 그러면 나중에 사용 하려 면 p 가 NULL 인지 판단 할 때 판단 합 니 다.
예 1

#include 
#include 
void GetMemory(char *p)
{
    p = (char *)malloc(100);
}
int main(void)
{
    char *str = NULL;
    GetMemory(str);
    strcpy(str,"hello world");
    printf(str);
}

프로그램 은 먼저 char 형식의 포인터 str 를 신청 하고 str 를 NULL (즉, str 에 저 장 된 것 은 NULL 의 주소 이 고 * str 는 NULL 중의 값 은 0) 로 가리 키 며 함 수 를 호출 하 는 과정 에서 다음 과 같은 동작 을 했다. 1 char 형식의 포인터 p 를 신청 하고 2 str 의 내용 을 p 에 복사 했다. (이것 은 매개 변수 전달 과정 에서 시스템 이 한 것 이다) 3 은 p 포인터 에 100 개의 공간 을 신청 했다.4 Test 함 수 를 되 돌려 줍 니 다. 마지막 프로그램 은 str 가 가리 키 는 메모리 공간 에 문자열 hello World 를 복사 합 니 다. 여기까지 오류 가 발생 했 습 니 다!str 의 공간 은 항상 NULL 이지 실제 공간 이 없습니다. 함수 호출 의 두 번 째 단 계 를 깊이 이해 하면 문제점 을 발견 하기 어렵 지 않 습 니 다!

#include 
#include 
char *GetMemory(void)
{
    char p[] = "hello world";
    return p;
}
int main(void)
{
    char *str = NULL;
    str = GetMemory();
    printf(str);
}

프로그램 은 먼저 char 형식의 포인터 str 를 신청 하고 str 를 NULL 로 가 리 킵 니 다. 함 수 를 호출 하 는 과정 에서 다음 과 같은 동작 을 했 습 니 다. 1 배열 p [] 를 신청 하고 hello World (배열 의 공간 크기 는 12) 로 할당 합 니 다. 2 배열 이름 p 을 str 지침 (즉, 배열 의 첫 주 소 를 되 돌려 줍 니 다) 으로 되 돌려 줍 니 다. 그러면 문자열 'hello World' 를 인쇄 할 수 있 습 니까?당연히 안 되 지!함수 가 호출 될 때 마지막 단 계 를 빠 뜨 렸 기 때 문 입 니 다. 즉, 두 번 째 return 배열 이름 후에 함수 호출 은 한 단계 더 해 야 합 니 다. 즉, 메모리 공간 을 방출 하 는 것 입 니 다. 함수 가 호출 된 후에 그 안의 모든 변수 가 사용 하 는 공간 을 방출 합 니 다. 배열 공간 이 방출 되 었 습 니 다.그 러 니까 str 가 가리 키 는 내용 이 뭔 지 모 르 겠 어 요.

#include 
#include 
void GetMemory2(char **p, int num)
{
    *p = (char *)malloc(num);
}
int main(void)
{
    char *str = NULL;
    GetMemory2(&str,100);
    strcpy(str,"hello");
    printf(str);
}

정 답 은 hello 를 출력 할 수 있 는데 메모리 가 새 어 나 갔 어 요!

#include 
#include 
int main(void)
{
    char *str = (char *)malloc(100);
    strcpy(str,"hello");
    free(str);
    if(str != NULL)
    { 
        strcpy(str,"world");
        printf(str);
    }
}

신청 공간, 복사 문자열, 방출 공간. 앞의 세 단계 작업 은 아무런 문제 가 없습니다. if 문장의 판단 조건 이 잘못 되 기 시 작 했 습 니 다. 포인터 가 풀 려 난 후에 그 내용 은 NULL 이 아니 기 때 문 입 니 다.정확 하지 않 은 값 입 니 다. 따라서 if 문 구 는 영원히 실 행 될 수 없습니다. 이것 도 유명한 '야' 포인터 문제 입 니 다. 그래서 우 리 는 프로그램 을 작성 하여 지침 을 놓 은 후에 반드시 인위적으로 지침 을 NULL 로 지불해 야 합 니 다. 그러면 '야' 포인터 가 나타 나 는 것 을 피 할 수 있 습 니 다. 어떤 사람 은 '야' 포인터 가 무 섭 고 예상 치 못 한 오 류 를 가 져 올 수 있 습 니 다.
레 퍼 런 스http://blog.csdn.net/pfgmylove/article/details/3212163
수정 이 있다

좋은 웹페이지 즐겨찾기