2013-06-18 4 views
1

this question 나는 지역 변수의 주소를 내보내고 그것이 선언 된 함수 밖에서 사용해서는 안된다는 것을 배웠다.K & R의 함수 외부에서 지역 변수에 액세스하는 예는 무엇입니까?

그러나 아래 그림과 같은 프로그램에서 K & R이이 규칙을 위반하고있는 것으로 보입니다. their book, p. 108.

readlines 함수 내에서 lineptr[nlines++] = p; 행을 봅니다. p을 '내보내기'하고 나중에 readlines 외부에서 사용하는 것이 바람직한 이유는 무엇입니까?

lineptr[nlines++] = p; 

p의 값이 저장되어 있지 그 주소 :에서는

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

#define MAXLINES 5000 

char *lineptr[MAXLINES]; 

int readlines(char *lineptr[], int nlines); 
void writelines(char *lineptr[], int nlines); 

void qsort(char *lineptr[], int left, int right); 

int main(int argc, char *argv[]) 
{ 
    int nlines; 

    if((nlines = readlines(lineptr, MAXLINES)) >= 0) { 
      qsort(lineptr, 0, nlines-1); 
      writelines(lineptr, nlines); 
      return 0; 
    } 
    else { 
      printf("error: input too big to sort\n"); 
      return 1; 
    } 
} 


#define MAXLEN 1000 
int getline(char *, int); 
char *alloc(int); 

int readlines(char *lineptr[], int maxlines) 
{ 
    int len, nlines; 
    char *p, line[MAXLEN]; 

    nlines = 0; 
    while((len = getline(line, MAXLEN)) > 0) 
     if(nlines >= maxlines || (p = alloc(len)) == NULL) 
      return -1; 
     else { 
      line[len-1] = '\0'; 
      strcpy(p, line); 
      lineptr[nlines++] = p; 
     } 
    return nlines; 
} 

void writelines(char *lineptr[], int nlines) 
{ 
    while(nlines -- > 0) 
     printf("%s\n", *lineptr++); 
} 

int getline(char s[], int lim) 
{ 
    int c, i; 

    for (i = 0; i < lim - 1 && (c = getchar()) != EOF && c != '\n'; i++) 
    s[i] = c;               
    if (c == '\n') { 
    s[i++] = c; 
    } 
    s[i] = '\0'; 
    return i; 
} 

#define ALLOCSIZE 10000 

static char allocbuf[ALLOCSIZE]; 
static char *allocp = allocbuf; 

char *alloc(int n) 
{ 
    if(allocbuf + ALLOCSIZE - allocp >= n) { 
      allocp +=n; 
      return allocp - n; 
    } 
    else 
      return 0; 
} 

void swap(char *v[], int i, int j) 
{ 
    char *temp; 

    temp = v[i]; 
    v[i] = v[j]; 
    v[j] = temp; 
} 

void qsort(char *v[], int left, int right) { 

    int i, last; 

    if(left >= right) 
     return; 

    swap(v, left, (left+right)/2); 
    last = left; 

    for(i = left + 1; i <= right; i++) 
     if(strcmp(v[i], v[left]) < 0) 
     swap(v, ++last, i); 

    swap(v, left, last); 
    qsort(v, left, last-1); 
    qsort(v, last+1, right); 
} 
+4

저는 K & R의 책에'system ("PAUSE");'_never_ '이 99.9 % 확실하게 나타났습니다. –

+0

네가 맞아. 고마워. 결정된. –

+0

로컬 변수의 주소는 어디에서 확인됩니까? –

답변

6

. 주소는 &p입니다. 물론 p의 값은 p이 포인터이기 때문에 발생하며, 포인터 값은 주소를 나타냅니다. 그러나 여기에는 아무런 결과가 없습니다. 규칙은 아직도 따라하고있다; 어떤 로컬 변수의 주소도 함수 외부의 아무 곳에도 저장되지 않았으며 p의 값은 로컬 변수의 주소가 아닙니다.

전화 체인을 따를 경우 p 값이 0이거나 allocbuf 내부의 주소 일 수 있습니다. allocbuf은 지역 변수가 아닙니다. 파일 범위의 변수는 static입니다.

+0

물론, 아아아! 이제는 내 인생을 함께 할 수 있습니다 :) 정말 고마워요. –

관련 문제