2014-10-01 1 views
0

단순히 난 p를 사용 strp[i]='x'; (어디 수단 조작 할 수 있으며, i는 str을 종료 시작 (여행)에 액세스 할 수 있고, 단순히 그것을 가리키는 char *p을 한 char 배열 str.later을 유효한 인덱스, x : 임의의 문자)가 유효합니까 ?? actully 내가 그것을 노력하고, 내 질문은 거기에 malloc (즉, P = malloc (l * sizeof (char));) 사용하여 메모리를 줄 필요가 없다는 것을 시도했다.가리키는 char 배열을 조작하기 위해 char 포인터를 사용할 수 있습니까? A :

#include<stdio.h> 
#include<string.h> 
int main() 
{ 
    char str[20]; 
    char *p; 
    scanf("%s",str); 
    printf("%s\n",str); 
    int l=(int)strlen(str); 
    // printf("l= %d\n",l); 
    //p=str; 
    //p=malloc(l*sizeof(char)); 
    p=str; 
    int i; 
    for(i=0;i<l;++i) 
    printf("%c-",*(p+i)); 
    printf("\nNow p=%s\n",p); 
    p[1]='x';  // it is valid , but difficult to understand?? we didnot give it memory,but it can manipulate the str as well. 
    printf("After changes made\n",p); 
    printf("p=%s\n",p); 
    printf("str=%s\n",str); 
    return 0; 
} 
+1

네, 괜찮습니다. 'char str [20];'는 20 바이트를 할당하고 그 할당을 가리 키기 위해'p'를 사용하고 있습니다. –

+0

*'* p'는 유효한 메모리 *를 가리켜 야합니다. – usr2564301

+0

'p = str'은'p'가'char' 배열'str'의 기본 주소를 가지고 있음을 나타냅니다. –

답변

1

이 경우 p에 메모리를 할당 할 필요가 없습니다. 메모리가 str에 대해 스택에 할당되었을 때 : char str[20];. 이후에 p=str;pstr은 모두 스택의 동일한 메모리 주소를 가리 킵니다. str이 범위 내에있는 한 strp을 사용하여 공유 메모리 주소에서 값을 조작 할 수 있습니다. 따라서 p[1]='x';str[1]='x';은 동일합니다.

범위가 str 범위를 벗어난 후에 p 값을 유지하고 사용하려고하면주의해야합니다. 정의되지 않은 동작이 발생합니다. str이 범위를 벗어 났을 때 메모리가 해제되고 p이 스택의 다른 주소로 사용될 주소를 가리킬 때 메모리가 해제됩니다. p을 사용하면 원하는 것을 얻지 못할 수도 있고 p을 변경하면 관련없는 값이 방해받을 수 있습니다.

Doing p=malloc(l*sizeof(char));은 힙에 새 메모리를 할당합니다. 힙에서이 메모리를 해제해야 할 책임이 있기 때문에 처리가 할당 된 범위에서 종료 될 때 할당됩니다.

여기에서 더 많은 관련 콘텐츠를 찾을 수 있습니다. What is the difference between char s[] and char *s in C?

+0

1'str'이 범위를 벗어날 때 누구에게'p' 포인트 ?? – m23

+0

이제 p는 'NULL'을 가리 킵니까 ?? – m23

+1

아니요, 계속 동일한 메모리 위치를 가리 킵니다. 이제는 다른 메모리 나 가비지에서 사용할 수 있습니다. – Max

0

p가 가리키는 바이트의 내용 만 바꾸기 때문에 새 메모리를 할당 할 필요가 없습니다.

+0

'p = str;'이것은 내가 같은 주소를 가지고 있음을 의미하지만, 이제는 p가 자신의 메모리 공간을 가진 str과 같은 배열이거나 str과 공유한다는 것을 의미 하는가? – m23

관련 문제