2011-03-30 4 views
-4

나는 C++에서 질문을하고 있지만 일부는이 부분에 갇혀있다. 긴 코드이지만 지금 막 붙어있는 곳의 일부만 게시합니다. 여기있어; 내가 할 때 "HELLO"라는 문자에 X 점은 내가 Y에만 인쇄 'H'편지를 인쇄 할 때 경우char *를 C++의 char에 복사하는 방법

char* x = (char*)malloc(sizeof(char)); 
char y = (char)malloc(sizeof(char)); 
y = *x; 

문제이다.

char *가 가지고있는 단어 전체를 char 변수에 복사하고 싶습니다. 또한 그들은 사용자에 의해 주어진 있기 때문에 char의 크기를 알지 못합니다. 길이는 아무 것도 될 수 있습니다. 나는 strcpy()를 시도했지만 couldnt은 문제를 해결할 수 있었다.

도움을 주시면 감사하겠습니다.

** 모든 댓글 주셔서 감사합니다. 이제 std :: string을 사용자의 의견에 따라 사용하기로 결정했습니다. 그리고 나는 Im가 결코 malloc을 다시 사용하지 않을 것이라고 생각합니다. 이제 코드로 돌아가서 문자열에 따라 모든 것을 변경하고 모든 것이 작동하는지 확인해야합니다.

+1

이 숙제가 있습니까? – trojanfoe

+8

이것이 C++ 인 경우 malloc()을 시험하기 전에 std :: string을 오래 배워야합니다. –

+2

이것이 정말로 C++이라면, 아마도'malloc'을 사용해서는 안되며 아마도'std :: string' 타입을 사용해야 할 것입니다. –

답변

5

이노고 몬토야의 말을 바꾸기 위해 나는이 코드가 당신이 생각하는 것을 의미한다고 생각하지 않습니다.

malloc(sizeof(char))

이 일정한 양의 메모리를 할당한다. 얼마나 많은 메모리가 할당되는지는 malloc의 매개 변수에 의해 결정됩니다. 이 경우 정확히 정의하면 1 바이트 인 정확히 sizeof(char)을 전달합니다. 따라서 1 바이트의 메모리를 할당합니다.

malloc (자세한 내용은 나중에 설명)을 사용하려는 경우 저장하려는 문자열의 길이를 알아 내고 NULL 종결 자에 대해 한 바이트 더 추가 한 다음 malloc 그 정도를 계산해야합니다. 13 자 문자열 Hello, world.의 경우, 해당 호출은 다음과 같습니다

malloc(14)

다음 :

char y = (char)malloc(sizeof(char));

malloc가 당신을 위해 할당 된 메모리에 대한 포인터를 반환합니다. 이 경우 y은 포인터가 아니며 단지 char입니다. 둘은 동일하지 않습니다. 컴파일하고 이 이라는 C 스타일의 캐스트로 알려진 bludgeoning 도구를 사용하기 때문에이 작동합니다. 이것은 컴파일러에게 "나는 총을 내 발로 가리키고 있다는 것을 알고있다. 내가하는 말을하고 불평하지 마라." 그것은 정직하게 행동한다. 하지만 여러 가지 이유로 잘못된 일을하고있어 :

  1. malloc는 포인터를 반환하지만 당신은 당신은 단지 1 바이트를 할당 char
  2. 에 캐스팅하기 위해 노력하고 있지만, 당신은 당신이 할당 된 것으로 전체 문자열의 가치가있는 메모리
  3. y은 단지 char이지만 전체 문자열 인 것처럼 취급합니다.

    static const char* HELLO = "Hello, malloc."; 
    
    char* x = malloc(strlen(HELLO)+1); 
    strcpy(x, HELLO); 
    char* y = malloc(strlen(x)+1); 
    strcpy(y, x); 
    

    을, 당신은 C++로 모든 malloc를 사용해서는 안 :

그래서 다시 malloc를 사용하여 주장하는 경우, 당신은 같은 것을 할 필요가있다. 대신 std::string를 사용한다 :

  1. string의가 그들의 자신의 메모리를 관리 :

    std::string x = "Hello, string."; 
    std::string y = x; 
    

    때문 낫다. 코드에서했던 것처럼 메모리가 누출되지 않습니다.

  2. 은 유형 안전합니다. malloc에서 char으로 반송 할 때 유형 안전을 위반했습니다. 당신은 그것을 할 수 있지만, 하지 않습니다 char. 그 나쁜.은 큰 노력을 기울이지 않고 이런 식으로 자신을 쏠 수 없습니다.
  3. 코드가 적습니다. 가장 좋은 코드는 작성하지 않은 코드입니다.
+0

char 문자열을 null 종결하지 않았기 때문에 때때로 strlen()이 실패하지 않습니까? –

+0

@ 0A0D : "실패"는 "잘못된 일을 함"을 의미한다고 가정하십시오. 따라서 위의 코드에서 모든 문자열은 NULL로 종료됩니다. –

+0

코드가 안전하지 않게되어 하나의 조언으로 널로 끝나는 것으로 가정해서는 안됩니다. –

5

IT는 안됩니다. 실제로 컴파일해야합니다.

라인 char y = (char)malloc(sizeof(char)); 이해

malloc에 ​​보유 일부 메모리 만든 다음 그 메모리에 대한 포인터를 반환하지 않습니다 - 당신은

'Y'와 같은 비 포인터 변수에 대한 포인터를 할당 할 수 없습니다

또한 첫 번째 줄에서 malloc에게 sizeof (char) = 1이라는 단일 문자에 대한 메모리를 예약하도록 요청했지만 사용자가 입력 한 문자 수는 아닙니다.

+0

올바른데, 'malloc'이'void *'를 반환하기 때문에 컴파일되지 않을 것이라고 덧붙이 겠지만,'char'에 캐스팅하는 것은 실패 할 것입니다. –

+0

동의 함. 그 말은 "메모리의 단일 문자 할당"다음에 메모리 포인터를 char으로 캐스팅하여 주소의 하위 8 비트 (16 비트)를 제외한 모든 비트를 제거하는 것입니다. –

+0

FWIW,'malloc' 함수는 포인터를 반환합니다. OP는 포인터 변수를'char' 변수에 할당하고 있습니다. 그러나'malloc'의 반환 값을 캐스팅하면 컴파일러가 오류를보고하지 않게됩니다. –

1

char 유형에는 하나의 문자 만 포함될 수 있기 때문에 전체 단어를 char 변수에 넣을 수는 없습니다. 표준 C에는 string 유형이 없으므로 문자열을 나타 내기 위해 문자 배열을 사용해야합니다.

또한 할당하려는 메모리가 힙 어딘가에 있기 때문에 malloc 함수는 포인터 만 반환합니다. 가변 길이 값을 포함하도록 스택을 동적으로 늘리거나 줄이려는 방법 (*)이 없습니다.

(*) 표준 C에는 방법이 없습니다. 휴대용이 아닌 비표준 기능을 사용하는 데는 여지가 있습니다.

0

이 코드에 관한 모든 내용이 잘못되었습니다. 첫 번째 행은 한 문자에 공백을 할당하고 x에 주소를 저장합니다. 충돌없이 한 캐릭터 이상을 보유하고 있다는 사실은 순수한 행운입니다. 두 번째 줄은 한 문자를위한 공간을 할당 한 다음 주소를 단일 문자로 바꾸기 때문에 더욱 심각합니다.

다음과 같이 보입니다. char x = (char) malloc (sizeof (char) * sizeOfYourString); char y = (char) malloc (sizeof (char) * sizeOfYourOtherString);

strcpy (x, y);

1

std::string이 바람직하다.

C 스타일 문자열은 포인터를 사용하기 때문에 할당 (operator=)을 사용하여 복사 할 수 없습니다.

복사 할 때 strcpy과 같은 strxxx 기능 패밀리를 사용해야합니다. 복사하기 전에 수신기에 메모리를 할당해야합니다.

관련 문제