2014-08-27 2 views
0

나는 알아낼 수없는 매우 간단한 문제가 있습니다. 나는 이것을 가지고있다 :배열 char * 및 각각에 대해 메모리를 할당하는 방법

char* array[10]; 

그렇다면 나는 10 char* 포인터를 스택에 가지고있다. 이제는 각 포인터에 메모리를 할당하고 싶습니다. 마찬가지로 :

error: invalid conversion from ‘void*’ to ‘char*’ [-fpermissive] 
: 나는 메모리를 할당하는 첫 번째 단계에서 컴파일 타임 오류를 얻고있다, 그러나

strncpy(array[0], "hello", sizeof("hello")); 

: 다음

array[0] = malloc(sizeof(char)*6); 

그리고는이 위치에서 일부 문자를 저장

그러나 예상대로 작동합니다 Ideone.

내가 뭘 잘못하고 있니? 내가 무엇을 이해 노력하고 이해하지만 왜 작동하지 않습니다 이해가 안돼. array의 각 색인에는 char*이 있습니다. = 기호를 사용하여 각 포인터를 할당 된 메모리 블록에 할당하려고합니다.

내가 뭘 잘못하고 있니? g ++ -g -Wall

+3

귀하의 질문은 C++를 태그해야한다. g ++는 C++ 파일과 함께 사용됩니다. 순수한 C 코드로 컴파일하려고하면 코드가 작동합니다. – Igor

+0

@Igor,이 코드 스 니펫에 gcc와 g ++를 사용하는 것의 차이점은 무엇입니까? – sherrellbc

+2

G ++는 C++ 컴파일러이며 C++ 컴파일러는'void *'에서'AnythingElse *'(예 :'char *') 로의 변환을 요구합니다. C 컴파일러는 C 스타일 캐스트로 쓰여진 경우 컴파일러가 받아 들일 수 있지만 캐스트를 요구하지 않습니다. –

답변

1

귀하의 코드를 컴파일 는 C 유효하지만 당신은 C unike, void*에서 char*에는 암시 적 변환이 없습니다, C++과 같은 코드를 컴파일하고 있습니다.

코드를 C로 컴파일하려는 경우 (이 경우 캐스트가 필요하지 않음) g++ 대신 gcc을 사용하십시오. 또한 파일 확장자가 gcc 인 C++ (.cpp, .C, .cxx 또는 .cc)로 끝나지 않도록하십시오. 또는 안전하게 재생하고 .c 확장자를 사용하십시오. 당신이 코드 유효한 C++를 확인하려면


, 당신은 char*으로 캐스팅해야합니다 내가 잘못 뭐하는 거지

array[0] = (char*)malloc(sizeof(char)*6); 
+0

C는 포인터를 자동으로 void로 만듭니다. – Igor

+0

일반적으로 경고가 아닌가요? 나는이 컴파일 오류를 알아 차렸다. 그러나 블록이 char이고 char *가 아니었기 때문에 생각했다. 그런 다음 나는 뭔가를 이해하지 못했다. – sherrellbc

+0

@Igor OP는 C++로 컴파일됩니다. 답변을 수정했습니다. – juanchopanza

2

? g ++ -g -Wall

로 컴파일하면 g ++ 항상 .cpp.c 파일을 컴파일합니다. GCC와 같은 C 컴파일러로 컴파일하십시오. C++에서 반환 값은 malloc이어야합니다. C의 경우 do not cast return value of malloc입니다.

0

이것은 아마도 C와 C++ 사이의 가장 눈에 띄는 차이 일 수 있습니다. C는 malloc()에 의해 반환 된 void*을 암시 적으로 다른 유형으로 변환 할 수 있습니다. C++은 변환 할 수 없습니다.

g++으로 컴파일하거나 .cpp 파일 이름 확장명을 사용하면 C 코드가 아닌 C++ 코드로 컴파일됩니다. 대신 gcc을 사용하고 소스 파일이 .c으로 끝나고 코드가 올바르게 컴파일되는지 확인하십시오.다른 사람들이 지적 array[0] = static_cast<char*>(malloc(sizeof(char)*6));

0

으로, C++는 void *에서 char *에 암시 적 변환을 허용하지 않습니다

또 다른 해결책은 C++에 필요한 캐스트를 추가하는 것입니다. 이 정말 C++ 코드로 가정하는 경우

, 내가 대신 동적 메모리 할당에 대한 mallocnew을 사용 좋을 걸,이 특정 코드를 내가 대신 char *의 배열의 vectorstring의를 사용하여 좋을 걸 :

#include <vector> 
#include <string> 
... 
std::vector<std::string> array; 
... 
array[0] = "hello"; // literal is implicitly converted to an instance of string 

stringvector 구현은 모든 메모리 관리를 수행합니다.

이것이 실제로 C 코드로되어 있다면 g++ 대신 gcc을 사용하여 컴파일하면됩니다. 이 같은

관련 문제