2011-04-27 2 views
0

다음 코드는 문자열 c의 내용을 arg [0]에 넣으려고합니다.이 변수 할당의 다른 점은 무엇입니까?

const char **argv = new const char* [paramlist.size() + 2]; 
argv[0] = c.c_str(); 

이것은 다른 방법입니다.

argv[0] = "someprogram" 

나중에 내 프로그램에서 두 번째 방법은 작동하지만 첫 번째 방법은 오류가 발생한다는 것을 알고 있습니다. 무엇이 다를 수 있습니까? 첫 번째 방법은 어떻게 바뀌어 올바르게 작동 할 수 있습니까?

문제가 발생하는 곳이다 : 나는 다음에 그것을 변경하는 경우, 다음 문제가 발생하지 않습니다

execvp(c.c_str(), (char **)argv); 

. 왜 그런가요?

execvp(argv[0], (char **)argv); 
+3

'c'변수에 대한 선언이 포함 된 코드를 게시 할 수 있습니까? –

+0

그냥 문자열 c입니다. –

+1

@z_buffer : 질문에있는 코드와 관련하여 * 어디에서 선언했는지는 실제로 중요합니다. 여러분은 여러분의 질문에'string c;'선언, 어떤 식으로'c'를 수정하는 코드, 그리고'argv'에 접근하는 방법을 포함하는 코드 스 니펫을 제공 할 수 있습니까? –

답변

1

당신은 _strdup를 사용할 수 있습니다

const char **argv = new const char* [paramlist.size() + 2]; 
argv[0] = _strdup(c.c_str()); 

_strdup 문자열의 복사본을 저장하기 위해 메모리를 할당합니다. 문자열을 모두 마쳤 으면 free()을 사용하여 메모리를 반환하십시오. 두 가지에서

char *_strdup (const char *s) { 
    char *d = (char *)(malloc (strlen (s) + 1)); 
    if (d == NULL) return NULL;     
    strcpy (d,s);         
    return d;          
} 
+0

_strdup를 사용하면 문자열의 복사본을 저장하기 위해 메모리를 할당하고 호출자는 메모리 누수가 발생하지 않도록해야합니다. – forsvarir

+0

'strdup'가 문제를 해결합니다. 메모리 관리에 대해 무엇을해야합니까? –

+0

예 알아요 :)하지만 질문은 단지 어떻게 첫 번째 방법을 바꿔 올바르게 작동시킬 수 있었습니까? 물론 std :: string과 std :: vector – hidayat

1

당신이 argv[0]const char* 포인터를 유지 :

_strdup 기능은 다음과 같이 보입니다. 그래서 유일한 관심사는 포인터가 유효하고 영점 종료 문자열을 가리키는 지 여부입니다.

"someprogram"포인터가 유효하며 프로그램 실행 중 제로 종료 문자열을 가리 킵니다.

c.c_str() 포인터는 std :: basic_string :: c_str() 함수에 의해 반환 된 순간부터 c 문자열이 변경되거나 소멸되는 순간부터 유효 함이 보장됩니다. 따라서 문자열 c에 명시 적 또는 암시 적으로 비상 수 함수 (소멸자 포함)를 액세스하면 argv[0]에 저장된 포인터가 유효하지 않게됩니다.

ADD :

분명히 당신은 단지 전용 (c 존재) std::string c의 범위에 argv를 사용해야하고이 과제를 한 후에 어떤 방법으로 c을 변경하지 마십시오 제대로 argv[0] = c.c_str(); 변형 작업을 만들려면 (argv[0] = c.c_str();).

관련 문제