저는 malloc과 무료 q가 있어야한다고 생각합니다. 그러나 함수 "return q". 그것이 자신의 기억에 q 값을 저장할 것이라는 것을 의미하지는 않습니다. 따라서 함수가 실행 된 후에도 데이터가 저장됩니까?
아니요, 데이터가 저장되지 않습니다. 사실 포인터 q를 할당하지 않고 포인터 q를 사용하면 문제가 발생할 수 있습니다. 또한이 함수의 실행이 완료되면 변수 char * q가 파기됩니다.
@ Michael의 대답에 의해 제안 된대로 데이터를 복사하기 전에 포인터 q에 메모리를 할당해야합니다.하지만이 함수로 데이터 반환을 완료하면 수동으로 할당 한 메모리를 해제해야합니다 (그렇지 않으면). 원인 메모리 누수
가 사용하기 적합한
char *strdup(const char *p) // From @Michael's answer
{
char *q;
q = malloc(strlen(p) + 1);
if(NULL != q)
strcpy(q, p);
return q;
}
void someFunction()
{
char* aDupString = strdup("Hello World!!!");
/*... somecode use aDupString */
free(aDupString); // If not freed, will cause memory leaks
}
를 (메모리 할당 있지만 포인터가 당신이 할당 된 메모리의 청크를 참조하지 않으며, 따라서 프로그램 실행에 걸쳐 액세스 할 수 없습니다가되는 상황) malloc? malloc이 필요한 다른 상황이 있습니까?
은 다음과 같은 경우에 사용하는 것이 적절하다 :
1
이> 배열의 사용 크기는 컴파일 타임에 알려져 있지 않다.
2> 크기 유연성이 필요합니다. 예를 들어, 함수는 작은 데이터 크기와 큰 데이터 크기로 작업해야합니다. (데이터 구조와 같은 같은 연결리스트, 스택, 큐, 등)
내가 지금까지 알고있는 것처럼 내가 새로운 변수를 내가 함수에 선언 된 변수가 될 것을 필요로 할 때마다 malloc을해야한다는 것입니다 다른 곳에 사용됩니다. 그게 사실이야?
나는 이것이 부분적으로 사실이라고 생각한다. 당신이 무엇을하려고하는지에 따라, malloc을 사용하여 주위를 돌아 다니는 방법이있을 수 있습니다.글쎄,
void strdup2(const char *p, char* strOut)
{
// malloc not require
strcpy(strOut, p);
}
void someFunction()
{
char aString[15] = "Hello World!!!";
char aDupStr[sizeof(aString)];
strdup2(aString, aDupStr);
// free() memory not required. but size is not dynamic.
}
을 strcpy''에 대한 호출을보고 : 예를 들어,에서는 StrDup은 또한 다음과 같은 방법으로 재 작성 할 수 있습니다. 'p'가 가리키는 문자열을'q'가 가리키는 배열로 복사하려고합니다. 'q'는 배열을 가리 키도록 초기화되지 않았습니다. 여기에는 가비지 값이 포함되어 있으므로이 값을 호출하면 메모리가 손상됩니다. 먼저 'q'를 'malloc'이 반환하는 것과 같은 적절한 저장소 블록의 주소로 설정해야합니다. 그래야만 그 목표에 쓸 수 있습니다. 단순한. –
q는 주소이지만 초기화되지 않았습니다. strcpy는 데이터를 취하여 q가 가리키는 위치에 넣으려고하지만 q는 유효하지 않은 것을 가리 킵니다. malloc을 호출하고 결과를 q에 대입하면 q가 데이터를 저장할 수있는 위치가됩니다. –
* 실제 * 문제는 수명에 대해 알아야한다는 것입니다. 유감스럽게도 대부분의 자습서에서는 중요한 과목이 아닌 구문 만 가르칩니다. – o11c