2014-01-11 3 views
2

다음 두 코드는 비슷하지만 첫 번째 코드는 구조가 있고 두 번째 코드는 구조가 아닙니다.* main에 char *와 struct에 * char

왜이 코드가 작동하는지 (경고 없음)?

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

struct prova 
{ 
    char *stringa; 
}; 

int main() 
{ 
    struct prova p; 

    strcpy (p.stringa, "example\0"); 

    printf("%s\n", p.stringa); 

    return 0; 
} 

다음 코드는 작동하지 않습니까? 이 경고와

Segmentation fault (core dumped)

:

code.c: In function ‘main’: code.c:8:9: warning: ‘stringa’ is used uninitialized in this function [-Wuninitialized] strcpy (stringa, "example\0");

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

int main() 
{ 
    char *stringa; 

    strcpy (stringa, "example\0"); 

    printf("%s\n", stringa); 

    return 0; 
} 

감사합니다!

+1

'stringa'에 대한 메모리를 할당하지 않았습니다. 그것은 효과가있을 수도 있지만 그렇지 않을 수도 있습니다. 첫 번째 예제에서 더 큰 문자열을 넣어보십시오. – m0skit0

+0

그래, 그게 잘못 알고,하지만 왜 첫 번째 코드가 작동하는지 이해가 안돼! (고맙습니다.) –

+0

메모리가 할당 된 방법에 대한 내부 구조 때문입니다. 첫 번째 예제는 초당 할당량보다 많은 메모리를 할당하거나 다른 방식으로 할당합니다. 이는 컴파일러에 따라 다르며 아마도 다른 컴파일러/플랫폼을 사용하면 다른 결과가 나타납니다. – m0skit0

답변

4

초기화되지 않은 변수로 지정된 주소로 복사하기 때문에 어느 쪽도 올바르지 않습니다. 따라서 두 프로그램 모두 정의되지 않은 동작을 호출합니다.

프로그램 중 하나가 작동한다는 사실은 순수한 기회에 이릅니다. 정의되지 않은 동작의 가능한 한 가지 형태는 프로그램이 올바르게 실행되는 것입니다.

충분한 크기의 메모리 블록을 가리 키도록 포인터를 초기화해야합니다. 예 :

char *stringa = malloc(8); 

문자열 리터럴에 널 종결자를 추가 할 필요가 없습니다. 그것은 함축적입니다. 그래서,이 메모리 할당 주어진 당신은 쓸 수 있습니다 :

strcpy(stringa, "example"); 
+0

감사합니다. 대단히 감사합니다! 그러나 이것은 :'char * stringa = malloc (10 * sizeof (char));'이것과 동일합니다 :'char stringa [10];'? –

+2

@user 아니에요. 전자는 누출을 피하기 위해'free'를 호출하여 해제되어야하는 동적 메모리를 할당합니다. 후자는 스토리지를 자동으로 할당하고 문자 배열은 포함 된 범위만큼만 지속됩니다. 'sizeof (char)'는 정의에 의해 1과 같으므로 관용적 인 C가이를 생략합니다. 만약 당신이 자동으로 할당하려고한다면'char stringa [] = "example";' –

+0

을 미리 쓸 것입니다. malloc을 사용하는 크기를 미리 알지 못한다면, 크기를 알고 있다면 무엇을 선택해야할까요? 예)'char * stringa = malloc (10);'또는'char stringa [10];'? –

1

문자열을 복사 할 문자열을 지정해야합니다.

첫 번째 예 이외의 사용 malloc

는 컴파일되지 않습니다.

1

당신이

구조체 PROVA { 의 char *의 stringa을 쓸 때; };

int main() { struct prova p;

strcpy (p.stringa, "example\0"); 

p.stringa가 특별히 아무 것도 가리 키지 않지만 사용자가 복사한다는 것을 알아 두십시오.