2014-11-16 4 views
-1
#include <stdio.h> 
#include <string.h> 
#include <windows.h> 
#include <conio.h> 

void main(){ 
    void generateId(char*, char*); 

    char name[20]; 
    char id[7]; 
    printf("Enter your name: "); 
    scanf("%s", name); 
    generateId(name, id); 

} 

void generateId(char *name, char *id){ 

    char *ptrName = name; 
    char *ptrId = id; 
    puts(ptrName);//crashes if i used puts(*ptrName); 
} 

누군가 내가 위에서 설명한 줄을 설명 할 수 있습니까? 포인터를 역 참조하려고하면 프로그램이 왜 20 미만의 유효한 입력을주는 충돌이 발생합니까? 대신 포인터를 역 참조하지 않을 때 충돌이 발생하지 않았습니다. 역 참조를 입력하면 입력 한 값을 제공해서는 안됩니까? 하지만 그것을 역 참조하지 않으면 어떻게 내게 가치를 부여 할까?C 포인터 역 참조

+1

'puts (ptrName)'이라고 쓰면, 컴파일하지 않아야합니다 ... –

답변

1

기능 puts은 메모리에서 Null 종료 문자열의 주소를 필요로합니다.

코드에서 변수 ptrName은 실제로 메모리에서 Null 종료 문자열을 가리키고 있습니다.

그러나 puts(*ptrName)을 호출하면 대신 해당 문자열의 첫 번째 문자가 전달됩니다.

puts 함수에 전달하면 해당 문자의 값이 주소 크기 (일반적으로 4 또는 8 바이트)로 확장되고 함수는 유효한 null로 끝나는 문자열을 가리키는 것으로 간주합니다.

그런 다음이 함수는 해당 메모리 주소의 내용을 읽으려고 시도합니다. 공식적으로는 동작이 정의되지 않았지만 - 아무 일도 발생할 수 있습니다.

+0

"함수 put은 메모리에 널 종료 문자열의 주소를 요구합니다." 어디에서 작성한 것과 같은 특정 C 함수 세부 정보를 읽을 수 있습니까? – sutoL

+1

@sutoL : http://www.google.com을 열고 검색 창에'puts'를 입력하고 Enter를 클릭 한 다음 웹 링크 목록이있는 새 웹 페이지로 리디렉션 될 때까지 기다리십시오. - 상업 링크를 열고 그것을 엽니 다. –

1

ptrName은 char에 대한 포인터입니다. * ptrName은 char입니다. puts 함수는 포인터가 char가 아닌 매개 변수로 사용됩니다. 이런 식으로 사용하면 char 값을 포인터로 해석하여 메모리 위반을 유발합니다.