메모리를 할당하고 문자열을 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
'programing' 카테고리의 다른 글
AngularJS는 ng-model에서 포맷된 날짜를 얻습니다. (0) | 2023.10.31 |
---|---|
PHP, MySQL 오류: 열 개수가 1행의 값 개수와 일치하지 않음 (0) | 2023.10.31 |
기본 단어 변경쿼리를 제목별 순서로 누릅니다. (0) | 2023.10.31 |
엑셀 2010에서 "*"자를 제거하는 방법은? (0) | 2023.10.31 |
DialogFragment에서 결과 수신 (0) | 2023.10.31 |