|
한가지 아셔야 할께 있는데 const 선언입니다.
char chtemp[]="Let me say those words as hently as I can";
이라는 선언을 통해서 chtemp는 메모리 어딘가에 저장되어 있는 "Let me say those words as hently as I can" 이라는 상수 문자열의 포인터를 가지게 되었습니다.
a = chtemp; 에 의해서 malloc에 의해서 만들어진 문자 배열의 포인터 a의 첫번째 번지는 chtemp가 가르키는 번지로 변경이 되었습니다. 아무런 필요도 없고 매우 잘못된 문장입니다. 컴파일러는 a의 주소가 변경되었기 때문에 실행 오류를 낼 겁니다.
예를 들어, chtemp의 주소가 0xFF0000AA이고,
a의 문자 배열의 주소가 0xFF0000B0(a), 0xFF0000B1(a+1), 0xFF0000B2(a+2), 0xFF0000B3(a+3), ...
이런식으로 나간다고 가정하면
a = chtemp; 에 의해서 0xFF0000AA(a), 0xFF0000B1(a+1), 0xFF0000B2(a+2), 0xFF0000B3(a+3), ...
이렇게 바뀌었습니다. 즉 연속적인 메모리의 연결이 깨졌다는 것을 알수 있을 겁입니다.
printf("%s \n", *a);에 의해서 *a가 가르키는 번지의 문자열이 '\0'을 만날때까지 출력이 될 겁니다. 그런데 *a 가 가르키는 것은 0xFF0000AA에 있는 문자를 가르키므로 'L'이 될 겁니다. 이걸 번지로 변환하면 0x0000004C가 되므로 엉뚱한 메모리를 가르키게 되고 괜찮은 윈도우 컴파일러라면 잘못된 번지를 참조했다고 에러가 나겠죠.
아마도 원하시는 게 이거일 거라고 짐작합니다.
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
int main(int argc, char* argv[])
{
char *a;
char chtemp[] = ""Let me say those words as hently as I can";
a= (char *)malloc(50);
strcpy(a, chtemp);
printf("%s \n", a);
free(a);
return 0;
}
춤추는대수사선 님이 쓰신 글 :
: 감사합니다.
:
: void main() {
:
: char *a;
: a= (char *)malloc(50);
: char chtemp[]= { 'L', 'e', 't', ...... 'c', 'a', 'n', '\0' };
: a= chtemp; //이부분//
: printf("%s \n", *a);//그부분//
: free(chtemp);
:
: }
:
: ---------------------
: 이렇게 해봤는데
: '터보C++3.1 for 윈도우' 에서는
: 'and Itle' 이라고 출력되고,
: 그런데 비주얼 C++에서는
: 검은창 떴다가 아무글자도 없이
: '잘못된연산을 수행하....' 라고만 뜨는군요.
:
:
: 그리고 몇가지 질문을 더 드립니다.....^^;;
:
: //그부분// 말인데요.
: '*a'를 그냥 'a'로 놓으면 터보C에선 출력이 되었습니다.
: 비우얼C++에선 "Let me say those words as hently as I can" 이렇게 출력되고,
: 오류메세지 떴구요.
:
: 그리고
: free(chtemp)에서, 외부메모리를
: *a에 할당했으니까 free(*a)라고 해야되지 않나요?
: 근데 free(*a)로 쓰고 코딩하니 에러가 생기더군요...
: 아...정말 복잡하고 답답할 따름입니다. T^T
:
: 번번히 도와주셔서 감사합니다.
: 또한번 부탁드립니다.
:
:
:
|