programing

메모리를 할당하고 문자열을 c로 저장합니다.

megabox 2023. 10. 31. 20:42
반응형

메모리를 할당하고 문자열을 c로 저장합니다.

다음 코드가 왜 작동하지 않는지 궁금합니다.

int main(int argc, char **argv)
{
     char *test = (char*) malloc(12*sizeof(char));
     test = "testingonly";
     free(test);
}

고민 끝에 저의 가정은 우선 메모리에 12자를 넣을 공간을 할당하는데 다음 줄의 과제는 스택에 char 배열을 만들고 그 메모리 주소는 테스트를 위해 전달된다는 것이었습니다.so free()는 허용되지 않는 스택의 공간을 해제하려고 합니다.그것이 맞습니까?

그러면 힙에 문자열을 저장하는 올바른 방법은 무엇입니까?다음 방법이 일반적인 방법입니까?

int main(int argc, char **argv)
{
     char *test = (char*) malloc(12*sizeof(char));
     strcpy(test, "testingonly");
     free(test);
}
char *test = (char*) malloc(12*sizeof(char));

        +-+-+-+-+-+-+-+-+-+-+-+-+
test--->|x|x|x|x|x|x|x|x|x|x|x|x|   (uninitialized memory, heap)
        +-+-+-+-+-+-+-+-+-+-+-+-+

test = "testingonly";

        +-+-+-+-+-+-+-+-+-+-+-+-+
test +  |x|x|x|x|x|x|x|x|x|x|x|x|
     |  +-+-+-+-+-+-+-+-+-+-+-+-+
     |  +-+-+-+-+-+-+-+-+-+-+-+-+
     +->|t|e|s|t|i|n|g|o|n|l|y|0|  
        +-+-+-+-+-+-+-+-+-+-+-+-+

free(test); // error, because test is no longer pointing to allocated space.

포인터를 변경하는 대신test, 당신은 문자열을 복사해야 합니다."testingonly"예를 들어, 할당된 장소로 이동합니다.strcpy아니면 사용strdup. 다음과 같은 기능을 합니다.malloc그리고.strdup돌아가다NULL메모리가 부족한 경우 확인해야 합니다.

char *test = (char*) malloc(12*sizeof(char));
strcpy(test, "testingonly");

        +-+-+-+-+-+-+-+-+-+-+-+-+
test--->|t|e|s|t|i|n|g|o|n|l|y|0|
        +-+-+-+-+-+-+-+-+-+-+-+-+

아니면

char *test = strdup("testingonly");

        +-+-+-+-+-+-+-+-+-+-+-+-+
test--->|t|e|s|t|i|n|g|o|n|l|y|0|
        +-+-+-+-+-+-+-+-+-+-+-+-+

당신은 이미 당신의 질문에 대답을 했습니다.기본적으로 strcpy는 문자열을 복사하는 적절한 방법입니다.

첫 번째 버전에서는 스택에 문자열이 생성되지 않지만 허용되지 않는 것은 맞습니다.free과제가 끝난 후에 말입니다.문자열 리터럴은 일반적으로 메모리의 상수/읽기 전용 섹션에 저장됩니다.과제는 아무것도 베끼지 않고, 그냥 만드는 것입니다.test그 기억의 영역을 가리킵니다.자유롭게 할 수 없습니다.또한 해당 문자열을 수정할 수 없습니다.

당신의 두번째 코드는 정확하고 일상적입니다.당신은 또한 조사하는 것을 원할 수도 있습니다.strdup그것을 구현할 수 있습니다.

당신 말이 맞습니다.이제 첫 번째 코드 조각에 대해 알아보겠습니다.

char *test = (char*) malloc(12*sizeof(char));

위 코드는 문제없습니다.

test = "testingonly";

여기서 포인터를 수정했습니다.test메모리 누출로 이어집니다.그리고 당신이 자유롭게 하려고 할 때 당신은 실제 할당된 포인터를 자유롭게 하는 것이 아니라 가리키는 "테스트 전용" 리터럴 하나를 자유롭게 하는 것입니다.리터럴은 일반적인 시나리오에서는 무시할 수 없는 상수 메모리를 가리킵니다.

이제 두 번째 코드 조각에 대해, 이것은 리터럴이 있는 곳에서 당신의 것이 있는 곳으로 데이터를 명시적으로 복사했을 때 잘 작동할 것입니다.test가리키고 있습니다.

당신의 두번째 지점까지 예strcpy일반적인 방법입니다.다른 방법으로는 원시 바이트를 복사하는 경우 'memcpy'가 있습니다.

참고: 리터럴은 스택에 저장되지 않습니다.그러나 리터럴이 저장된 위치는 수정할 수 없습니다.

강령

#include <stdio.h>
int main(int argc, char **argv)
{
     char *test = (char*) malloc(12*sizeof(char));
     strcpy(test, "testingonly");
     printf("string is: %s\n",test);
     free(test);
     return 0;
}

통할 것입니다

이것은 메모리를 할당하기 위한 것입니다.

char *string;
string = (char *) malloc(15);

데이터 저장을 위한 것입니다.

strcpy(str, "kavitajain");
printf("String = %s,  Address = %u\n", str, str);

언급URL : https://stackoverflow.com/questions/8600181/allocate-memory-and-save-string-in-c

반응형