2012-06-22 3 views
1

char ** 유형의 이중 포인터를 함수에 전달하고 있습니다. 그 함수 안에서 포인터를 역 참조하고 문자 배열을 통해 색인을 생성해야합니다.이중 포인터를 역 참조하고 인덱스 연산자 사용

대문자를 배열에 다시 할당하려고하면 불행히도 코어 덤프가 발생합니다.

이 작업을 수행하는 방법에 대한 도움이 필요합니다. (이 숙제, 단지 개인적인 프로젝트가 아닙니다.) ""에서

void buffer(char **ppline); 

int main() 
{ 
    char *line="The redcoats are coming!"; 

    buffer(&line); 
    printf("\nline = %s\n",line); 

    return(0); 
} 


void buffer (char **ppline) 
{ 

int i=0; 
char a; 

    for (i=0; i < strlen(*ppline); i++) 
    { 
    a = toupper((*ppline)[i]); /* THIS LINE CAUSES THE CORE DUMP */ 
    ((*ppline)[i]) = a; 
    } 

    return; 
} 

답변

2

리터럴 문자열 상수이다. 정의되지 않은 동작이므로 수행중인대로 수정할 수 없습니다. 그것으로 저장 및 문자열 리터럴 사본을 할당하는이 시도 :

void buffer(char **ppline); 

int main() 
{ 
    char line[] = "The redcoats are coming!"; 

    buffer(&line); 
    printf("\nline = %s\n",line); 

    return(0); 
} 


void buffer (char **ppline) 
{ 

int i=0; 
char a; 

    for (i=0; i < strlen(*ppline); i++) 
    { 
    a = toupper((*ppline)[i]); /* THIS LINE CAUSES THE CORE DUMP */ 
    ((*ppline)[i]) = a; 
    } 

    return; 
} 
1

스택, 힙, datasegment (와 BSS) 및 텍스트 segement 프로세스 메모리의 4 개 개의 세그먼트입니다. 정의 된 모든 로컬 변수가 스택에 있습니다. malloc과 calloc을 사용하여 동적으로 할당 된 메모리는 힙에있게됩니다. 모든 전역 및 정적 변수는 데이터 세그먼트에 있습니다. 텍스트 세그먼트에는 프로그램 및 일부 상수의 어셈블리 코드가 있습니다.

이 4 개의 세그먼트에서 텍스트 세그먼트는 읽기 전용 세그먼트이며 다른 모든 세 세그먼트는 읽기 및 쓰기 용 세그먼트입니다.

char []a="The redcoats are coming!"; -이 구문은 스택에서 25 바이트의 메모리를 할당하며 (로컬 변수이기 때문에) 24 문자와 마지막에 NULL 문자 (\ 0)를 모두 유지합니다.

char *p="The redcoats are coming!"; -이 문은 스택에 4 바이트 (32 비트 컴퓨터 인 경우)의 메모리를 할당하며 (로컬 변수이기도하므로)이 값은 "redcoats are 오는!". 상수 문자열의이 바이트는 텍스트 세그먼트에 있습니다. 이것은 상수 값입니다. 포인터 변수 p는 해당 문자열을 가리 킵니다.

이제 a[0] (색인은 0-24 일 수 있음)은 스택에있는 해당 문자열의 첫 번째 문자를 액세스한다는 것을 의미합니다. 그래서 우리는이 위치에서도 글을 쓸 수 있습니다. a[0] = 'x'이 작업은 스택에 READ WRITE 액세스 권한이 있기 때문에 허용됩니다.

그러나 p[0] = 'x'은 텍스트 세그먼트에 대한 읽기 액세스 권한 만 있기 때문에 충돌로 이어집니다. 텍스트 세그먼트에 대한 쓰기 작업을 수행하면 분할 오류가 발생합니다.

그러나 로컬 변수가 스택에 있기 때문에 변수 p의 값을 변경할 수 있습니다. 아래와 같이

char *p = "string"; 
printf("%s", p); 
p = "start"; 
printf("%s", p); 

허용됩니다. 여기에서는 포인터 변수 p에 저장된 주소를 문자열 start의 주소로 변경합니다 (다시 시작은 텍스트 세그먼트의 읽기 전용 데이터이기도 함). * p에있는 값을 수정하려면 동적으로 할당 된 메모리로 이동하십시오. 지금 우리는 힙에 쓰기 때문에

char *p = NULL; 
p = malloc(sizeof(char)*7); 
strcpy(p, "string"); 

은 이제 p[0] = 'x' 작업은 허용된다.

관련 문제