2012-01-23 4 views
2

char ptr의 출력과 관련하여 문제가 있습니다. 내가 실행하려고 샘플 코드 .. 내가 메인에 들어갈char 포인터 결과가 잘못 출력됩니다.

struct DeviceInfo{ 

char * name; 
int id; 

}; 
void testFunc(DeviceInfo *info){ 

    char temp[50] = "test input"; 
    info->name = temp; 

} 
void main(){ 

    DeviceInfo deviceInfo; 
    testFunc(&deviceInfo); 
    std::cout<<"Output is "<<deviceInfo.name; 


} 

출력 이상한 하나의 어떤 종류 .... 는 "test.name"이 때 내가 알아 있음을 디버깅하는 동안입니다 다음 가비지 출력을 제공 할뿐만 아니라 "deviceInfo"객체의 "name"값을 해당 가비지 값으로 변경합니다 ... 이것은 테스트 시나리오의 일종이지만 실제 응용 프로그램에서는이 testFunc를 실행해야합니다 같은 방식으로 즉, 상수 char 문자열은 char ptr에 이름을 할당해야합니다.

저는이 temp [strlen (temp)] = '\ 0'과 같이 char temp의 끝에 '\ 0'을 넣으려고했습니다.

는하지만 여전히

라자

+0

아마도 temp [50]이 범위를 벗어나고 'name'이 할당 해제 된 메모리를 가리키고있을 수도 있습니다. testFunc 내부에'cout'을 넣고 무슨 일이 일어나는지 보려고합니다. –

+0

"temp"변수를 제거하면 작동합니다. 함수가 반환 될 때 귀하의 임시 "임시"배열 할당이 해제되고 생각합니다. –

+0

가능한 [로컬 변수의 메모리가 범위 외부에서 액세스 될 수 있습니까?] (http://stackoverflow.com/questions/6441218/can-a-local-variables-memory-be-accessed-outside-its-scope) –

답변

3

당신은 testFunc()이 범위를 벗어나면 사라 로컬 스토리지에 대한 포인터를 저장하는 ...

어떤 도움에 감사드립니다 작동니까.

상수 문자열에 대한 적절한 방법은 다음과 같습니다

info->name = strdup("test input"); 

또한 포인터로 name을하지를 선택, 대신에 char name[50];을 가질 수

info->name = "test input"; 

이상의 동적 뭔가

구조를 선택하고 다음을 수행하십시오.

또한 당신이있는 경우, 크기 인식 버전을 사용하는 것이 좋습니다 것 : name 여전히 포인터 인 경우

이 배열 솔루션을 가정합니다
snprintf(info->name, sizeof info->name, "%s", "test input"); 

참고, sizeof info->name 이해가되지 않습니다.

+0

'strdup'을 사용한다면, 일단 완료되면 메모리를 '비운다'는 것을 기억하십시오. 내가 수동으로 메모리 관리에 대한 좋은 이유가 없다면 대신'std :: string'을 제안 할 것이다. –

+0

잘 char 이름을 사용하여 [50] 문제를 해결합니다 .... :)하지만 난 그냥 왜 char ptr 문제가 있었는지 알고 싶습니다 ??? 그 이유는 char ptr이 testFunction의 종료 후에 파괴되기 때문에 더 이상 로컬 임시 변수에 액세스 할 수 없기 때문입니다. ??? –

4

temp은 스택 할당 변수이며, testFunc()이 반환 된 후에 소멸됩니다.

따라서 char*은 파괴 된 메모리를 가리 킵니다.

이로 인해 정의되지 않은 동작이 발생합니다.

+0

도와 주셔서 고맙습니다. –

5

범위가 다른 (따라서 수명이 다른) 구조의 멤버에 자동 변수에 대한 포인터를 지정하기 때문에 실패합니다. temp이 (가) testFunc 끝에 끝날 것이며 더 이상 액세스 할 수 없습니다.

+0

중요한 점 .... 도움을 요청한 thnx .... –

1

임시 배열에 포인터를 할당하고 있습니다. testFunc()이 반환되면 임시 배열이 삭제되고 info->name 포인터가 임의의 메모리를 가리키게됩니다.

+1

도움을 주셔서 감사합니다 ... :) –

4

우리는 문자열 클래스가있는 이유입니다.대신

struct DeviceInfo{ 
    std::string name; 
    int id; 
}; 

void testFunc(DeviceInfo *info){  
    info->name = "test_input"; 
} 

int main(){ 
    DeviceInfo deviceInfo; 
    testFunc(&deviceInfo); 
    std::cout<<"Output is "<<deviceInfo.name; 
} 
+0

불행히도 나는 여기에서 문자열을 사용합니다. :) 그럼에도 불구하고 문제는 해결되었습니다 –

0
char *temp = "test input"; 
info->name = (char*)malloc(sizeof(char) * strlen(temp) + 1); // Include room for \0  
strcpy(info->name, temp); 

:

char temp[50] = "test input"; 
info->name = temp; 

귀하의 char temp[50]는 더 이상 함수가 반환 후 유효하지 않습니다.

+0

thnx ... 문제를 해결합니다. –

관련 문제