C 프로그래밍: 다른 함수의 malloc()
이 malloc()
다른 기능 안에 있습니다.
포인터와 사이즈를 기능에게 전달하고 있습니다.main()
포인터에 .malloc()
, 내부에 있는 아닙니다.main()
.
포인터를 함수에 전달하고 호출된 함수 내부에서 전달된 포인터에 메모리를 할당하려면 어떻게 해야 합니까?
아래 코드를 작성했더니 아래와 같이 출력됩니다.
출처:
int main()
{
unsigned char *input_image;
unsigned int bmp_image_size = 262144;
if(alloc_pixels(input_image, bmp_image_size)==NULL)
printf("\nPoint2: Memory allocated: %d bytes",_msize(input_image));
else
printf("\nPoint3: Memory not allocated");
return 0;
}
signed char alloc_pixels(unsigned char *ptr, unsigned int size)
{
signed char status = NO_ERROR;
ptr = NULL;
ptr = (unsigned char*)malloc(size);
if(ptr== NULL)
{
status = ERROR;
free(ptr);
printf("\nERROR: Memory allocation did not complete successfully!");
}
printf("\nPoint1: Memory allocated: %d bytes",_msize(ptr));
return status;
}
프로그램 출력:
Point1: Memory allocated ptr: 262144 bytes
Point2: Memory allocated input_image: 0 bytes
포인터를 함수에 전달하고 호출된 함수 내부에서 전달된 포인터에 메모리를 할당하려면 어떻게 해야 합니까?
에게 물어보세요: . 면약면면면면면면면면면면면면int
걸걸어 ?떻 ?? ????
직접 반품하실 수도 있습니다.
int foo(void)
{
return 42;
}
또는 간접 수준을 추가함으로써 출력 매개 변수를 통해 반환한다(즉, v-in-in-direction 사용).int*
int
void foo(int* out)
{
assert(out != NULL);
*out = 42;
}
타입을 때 (반환할 때)T*
타입을 직접 포인터 타입을 직접 반환하거나 둘 중 하나입니다.
T* foo(void)
{
T* p = malloc(...);
return p;
}
또는, 다음의 1 레벨의 인터다이렉션을 추가합니다.
void foo(T** out)
{
assert(out != NULL);
*out = malloc(...);
}
포인터를 함수에 대한 파라미터로 포인터에 전달해야 합니다.
int main()
{
unsigned char *input_image;
unsigned int bmp_image_size = 262144;
if(alloc_pixels(&input_image, bmp_image_size) == NO_ERROR)
printf("\nPoint2: Memory allocated: %d bytes",_msize(input_image));
else
printf("\nPoint3: Memory not allocated");
return 0;
}
signed char alloc_pixels(unsigned char **ptr, unsigned int size)
{
signed char status = NO_ERROR;
*ptr = NULL;
*ptr = (unsigned char*)malloc(size);
if(*ptr== NULL)
{
status = ERROR;
free(*ptr); /* this line is completely redundant */
printf("\nERROR: Memory allocation did not complete successfully!");
}
printf("\nPoint1: Memory allocated: %d bytes",_msize(*ptr));
return status;
}
다른 답변에서 언급했듯이 포인터에 대한 포인터가 필요합니다.하지만 왜 그랬을까?
값을 수정하려면 포인터로 값을 전달해야 합니다.「 」를 int
그냥 int*
.
질문에서 입니다.int*
됨)NULL
메모리의 에.int**
.
조작에 , 「」가 됩니다.pInt
에 inside inside inside foo(int*)
인수의 복사입니다. 「」의 .main()
전합니니다다
void foo(int* pInt)
{
pInt = malloc(...);
}
int main()
{
int* pInt;
foo(pInt);
return 0;
}
그러니 포인터가 필요해
void foo(int** pInt)
{
*pInt = malloc(...);
}
int main()
{
int* pInt;
foo(&pInt);
return 0;
}
포인터 자체를 수정하려면 포인터로 포인터를 넘겨야 합니다.다음으로 간단한 예를 제시하겠습니다.
void allocate_memory(char **ptr, size_t size) {
void *memory = malloc(size);
if (memory == NULL) {
// ...error handling (btw, there's no need to call free() on a null pointer. It doesn't do anything.)
}
*ptr = (char *)memory;
}
int main() {
char *data;
allocate_memory(&data, 16);
}
포인터를 카피가 아닌 참조로 전달해야 함수의 파라미터alloc_pixels
에서는, 앰퍼샌드&가 포인터의 주소(C speak에서는 참조에 의한 콜)를 건네줄 필요가 있습니다.
메인(){부호 없는 문자 *input_image;부호 없는 int bmp_image_size = 262144; if(&input_image, bmp_image_size)==IFF)printf("\nPoint2:할당된 메모리: %d바이트",_msize(input_image);또 다른printf("\nPoint3:메모리가 할당되지 않았습니다."; } signed char allocate_signed char ** ptr, int size unsigned){서명된 char 상태 = NO_ERROR;*ptr = NULL; *ptr = (부호된 문자*)sigmoc(크기); if(*ptr) == NULL{상태 = ERROR;/* 프리(ptr);printf("\nERROR: 메모리 할당이 완료되지 않았습니다!"), */} printf("\nPoint1:할당된 메모리: %d바이트",_msize(*ptr); 복귀 상태}
를 드렸습니다.free(ptr)
「ERROR: ...」는 「ERROR: ...」로 표시됩니다"이러한 것은,alloc_pixels
혼란스러워서 기능을 합니다. 는 없다free
포인터(메모리 할당에 실패했을 경우)를 지정합니다.
편집: OP에서 제공하는 msdn 링크를 본 결과, 코드 샘플은 이전 답변과 동일합니다만...포맷 지정자를 로 변경하다%u
★★★★★★★★★★★★★★★★의 경우size_t
printf(...)
main()
.
메인(){부호 없는 문자 *input_image;부호 없는 int bmp_image_size = 262144; if(&input_image, bmp_image_size)==IFF)printf("\nPoint2:할당된 메모리: %u바이트",_msize(input_image);또 다른printf("\nPoint3:메모리가 할당되지 않았습니다."; }
포인터 솔루션에 대한 포인터를 얻을 수 있는 유일한 방법은 이 함수에 대해 발생했던 것과 유사한 문제에 대한 것입니다.
BOOL OpenBitmap2 ( LPCTSTR pszFileName, char** pszBMPFile)
임시 포인터를 할당하여 주소를 저장했습니다.
char* BMPFile;
{ BMPFile = (char*)GlobalAlloc(GPTR, dwFileSize + 1); // allocate storage using GlobalAlloc + 1 for null term string
재할당
{* pszBMPFile = BMPFile; return (0);} // Error = False
GlobalAlloc에서 직접 "* pszBMPFile"을 사용해도 효과가 없는 이유에 대한 코멘트를 주시면 감사하겠습니다.난 내 질문에 대답했어.다른 코드 행에 "*"를 pszBMPFile로 삽입하는 것을 잊었습니다.모든 기고가들로부터 좋은 교훈을 얻으세요.대단히 고맙습니다.
이것은 의미가 없습니다.
if(alloc_pixels(input_image, bmp_image_size)==NULL)
alloc_pixels
를 반환하다signed char
)ERROR
★★★★★★★★★★★★★★★★★」NO_ERROR
)와NULL
(어느쪽이든)
네가 원한다면input_image
.alloc_pixels
alloc_pixels
츠키다
signed char alloc_pixels(unsigned char **ptr, unsigned int size)
이렇게 부르죠.
alloc_pixels(&input_image, bmp_image_size);
메모리 할당은
*ptr = malloc(size);
초기 코드에서는 input_image를 allocate_pixels 함수에 전달했을 때 컴파일러가 그 복사본(즉 ptr)을 생성하여 값을 스택에 저장합니다.malloc에 의해 반환된 값을 ptr에 할당합니다.이 값은 함수가 main으로 돌아와 스택이 풀리면 없어집니다.따라서 메모리는 아직 히프에 할당되어 있지만 메모리 위치는 input_image에 저장되어 있지 않습니다(또는 에 할당되어 있지 않습니다).그 때문에 문제가 발생합니다.
allocate_pixels 함수의 시그니처를 알기 쉽게 변경할 수 있습니다.또, 추가의 「status」변수도 필요 없습니다.
unsigned char *alloc_pixels(unsigned int size)
{
unsigned char *ptr = NULL;
ptr = (unsigned char *)malloc(size);
if (ptr != NULL)
printf("\nPoint1: Memory allocated: %d bytes",_msize(ptr));
return ptr;
}
위의 함수는 메인에서 호출할 수 있습니다.
int main()
{
unsigned char *input_image;
unsigned int bmp_image_size = 262144;
if((input_image = alloc_pixels(bmp_image_size))==NULL)
printf("\nPoint3: Memory not allocated");
else
printf("\nPoint2: Memory allocated: %d bytes",_msize(input_image));
return 0;
}
매개 변수 할당은 해당 주소에 값을 설정한 경우에만 작동합니다.
하기 전에 할 이 두 . 즉, 2가지입니다.
1. C 기능:함수에 전달한 모든 파라미터가 함수의 복사본이 됩니다.
즉, 함수에서 수행한 모든 할당은 함수 외부의 변수에 영향을 미치지 않습니다. 실제로 복사 작업을 수행하고 있습니다.
int i = 1;
fun(i);
printf("%d\n", i);
//no matter what kind of changes you've made to i in fun, i's value will be 1
그래서 함수에서 i를 변경하고 싶다면, 당신은 물건과 그것의 복사본의 차이를 알아야 합니다.
복사본은 물건과 가치를 공유했지만 주소는 공유하지 않았다.
그게 그들의 유일한 차이점이야
따라서 함수에서 i를 변경하는 유일한 방법은 i의 주소를 사용하는 것입니다.
예를 들어, 새로운 함수 fun_addr이 있습니다.
void fun_addr(int *i) {
*i = some_value;
}
이렇게 하면 i의 값을 바꿀 수 있습니다.
- malloc:
fun_addr 함수의 핵심은 함수에 주소를 전달했다는 것입니다.또한 해당 주소에 저장된 값을 변경할 수 있습니다.
말록은 어떻게 할까?
malloc은 새 메모리 공간을 할당하고 해당 주소로 포인터를 반환합니다.
다음의 순서를 참조해 주세요.
int *array = (int*) malloc(sizeof(int) * SIZE);
어레이의 값이 malloc에 의해 반환된 주소와 동일하도록 합니다.
셨죠? 같은다 다다다다다다 함수에 전달된 매개 변수에 값을 영구적으로 할당합니다.은 「」입니다.address
.
여기서 주소(malloc에서 반환됨)를 주소(이전 주소 저장)에 할당합니다.
따라서 코드는 다음과 같습니다.
void fun_addr_addr(int **p) {
*p = (int*) malloc(sizeof(int) * SIZE);
}
이거면 될 거야.
언급URL : https://stackoverflow.com/questions/2838038/c-programming-malloc-inside-another-function
'programing' 카테고리의 다른 글
구조 선언의 콜론은 :1, :7, :16 또는 :32와 같이 무엇을 의미합니까? (0) | 2022.08.17 |
---|---|
실제 SQL 표시 최대 절전 모드 (0) | 2022.08.17 |
소품을 사용하여 v-model을 초기화하시겠습니까? (0) | 2022.08.17 |
C 또는 C++ 표준에서는 char를 부호 있는 문자 또는 부호 없는 문자로 명시적으로 정의하지 않는 이유는 무엇입니까? (0) | 2022.08.17 |
vuex: 상태 필드 "foo"가 "foo"에서 이름이 같은 모듈에 의해 재정의되었습니다. (0) | 2022.08.16 |