malloc(0)의 포인트는 무엇입니까?
방금 이 코드를 봤어요.
artist = (char *) malloc(0);
왜 이런 짓을 했을까?
사양에 따라 malloc(0)는 "null 포인터 또는 free()에 성공적으로 전달될 수 있는 고유 포인터"를 반환합니다.
이를 통해 기본적으로 아무것도 할당할 수 없지만 "artist" 변수를 걱정 없이 free() 호출에 전달할 수 있습니다.실제적인 목적을 위해 다음과 같은 작업을 수행하는 것은 다음과 같습니다.
artist = NULL;
C 표준(C17 7.22.3/1)에는 다음과 같이 기술되어 있습니다.
요청된 공간의 크기가 0인 경우 동작은 구현 정의됩니다.즉, Null 포인터가 반환되거나 반환된 포인터가 객체에 액세스하기 위해 사용되지 않는 것을 제외하고 크기가 0이 아닌 값으로 간주됩니다.
so,는,malloc(0)
할 수 있다NULL
또는 참조되지 않을 수 있는 유효한 포인터입니다.어느 경우든, 전화하는 것은 완벽하게 유효합니다.free()
위에.
는 별로 하지 않는다.malloc(0)
많은 용도가 있다, 단, 다음과 같은 경우는 제외한다.malloc(n)
에서 호출되고, '루프'로 호출됩니다.n
0으로 하다
링크의 코드를 보면 작성자가 두 가지 오해를 하고 있었던 것 같습니다.
malloc(0)
유효한 포인터가 항상 반환됩니다.free(0)
하다.
그는 .artist
기타 변수에는 항상 "유효한" 값이 포함되어 있습니다.적혀있네요.// these must always point at malloc'd data
.
malloc(0) 동작은 구현에 따라 다릅니다.라이브러리는 메모리를 할당하지 않고 NULL을 반환하거나 일반 malloc 동작을 할 수 있습니다.그게 무슨 짓을 하든 어딘가에 기록돼 있을 거야
일반적으로 유효하고 고유한 포인터를 반환하지만 참조를 취소해서는 안 됩니다.또, 실제로는 아무것도 할당하지 않았지만, 메모리를 소비할 수 있습니다.
null 이외의 malloc(0) 포인터를 재할당할 수 있습니다.
말 그대로 malloc(0)가 있는 것은 별로 쓸모가 없습니다.동적 할당이 0바이트이고 검증할 필요가 없을 때 주로 사용됩니다.
이 근처에는 반쪽짜리 정답이 많이 있습니다. 그래서 여기 확실한 사실이 있습니다.님의 맨 malloc()
라고 말합니다
크기가 0인 경우 malloc()는 NULL 또는 나중에 free()에 정상적으로 전달될 수 있는 고유한 포인터 값을 반환합니다.
, 그, 그, 그, 그, ,, ,, ,, 습, 습, 습, that 등의 .malloc(0)
NULLULL)은 일일음음음음음음음음음음음음음음음의 정의에 의해 됩니다.free()
맨페이지에 '하다, 맨페이지하다, 맨페이지하다, 맨페이지이다'라고써있는데요
ptr이 NULL일 경우 조작은 실행되지 않습니다.
그러니깐, 어떻든malloc(0)
될 수 있습니다.free()
. 'A'라고 'A'라고 하면 NULL
포인터
그 결과, 글쓰기는 artist = malloc(0);
쓰는 것보다 낫지 않다 artist = NULL;
왜 이렇게 하면 안 되는지...
malloc의 반환값은 구현에 따라 다르므로 NULL 포인터 또는 다른 주소를 반환받을 수 있습니다.이로 인해 오류 처리 코드가 크기와 반환 값을 모두 체크하지 않으면 힙 버퍼 오버플로우가 발생하여 안정성 문제(크래시) 또는 보안 문제가 더욱 심각해질 수 있습니다.
이 예에서는 반환된 주소를 통해 메모리에 액세스하면 힙이 파손되어 구현 시 NULL 이외의 값이 반환됩니다.
size_t size;
/* Initialize size, possibly by user-controlled input */
int *list = (int *)malloc(size);
if (list == NULL) {
/* Handle allocation error */
}
else {
/* Continue processing list */
}
자세한 내용은 위의 예제를 참조한 CERT Coding Standards의 이 Secure Coding 페이지를 참조하십시오.
이 페이지의 다른 부분에는 "malloc(0)는 유효한 메모리 주소를 반환하며, 그 범위는 메모리를 할당하는 포인터의 유형에 따라 달라집니다"라고 시작하는 답변이 있습니다.이 문장은 올바르지 않습니다(그 답변에 대해 직접 코멘트를 할 수 있는 충분한 평판이 없기 때문에 코멘트를 바로 아래에 넣을 수 없습니다).
malloc(0)를 실행해도 올바른 크기의 메모리는 자동으로 할당되지 않습니다.malloc 함수는 당신이 그 결과를 어디에 던졌는지 인식하지 못합니다.malloc 함수는 인수로서 지정한 사이즈 번호에만 의존합니다.예를 들어 0이 아닌 int를 저장하기에 충분한 스토리지를 가져오려면 malloc(size of(int))를 수행해야 합니다.
Windows 의 경우:
void *p = malloc(0);
는 로컬 힙에 제로 길이의 버퍼를 할당합니다.반환된 포인터는 유효한 힙 포인터입니다.malloc
으로는 종종 ult ult ult라고 부른다HeapAlloc
C 하여 C를 합니다.RtlAllocateHeap
등등.free(p);
HeapFree
0으로 하다해제하지 않으면 메모리 누수가 발생합니다.
글쎄요, 제가 찾은 임의의 malloc 소스 코드에 따르면 0을 입력하면 NULL 값이 반환됩니다. 따라서 아티스트 포인터를 NULL로 설정하는 것은 말도 안 되는 방법입니다.
http://www.raspberryginger.com/jbailey/minix/html/lib_2ansi_2malloc_8c-source.html
malloc(0)는 NULL 또는 free로 올바르게 전달할 수 있는 유효한 포인터를 반환합니다.그리고 그것이 가리키는 기억은 쓸모없거나 쓰거나 읽을 수 없는 것처럼 보이지만, 그것이 항상 진실인 것은 아니다.:)
int *i = malloc(0);
*i = 100;
printf("%d", *i);
여기서 세그멘테이션 장애가 발생할 것으로 예상되지만 놀랍게도 100이 인쇄됩니다!처음 malloc을 호출할 때 malloc이 실제로 큰 메모리 덩어리를 요구하기 때문입니다.그 후 malloc에 콜할 때마다 그 큰 덩어리의 메모리가 사용됩니다.그 큰 덩어리가 끝난 후에만 새로운 메모리가 요구됩니다.
malloc(0)의 사용: 후속 malloc 콜을 고속으로 하는 경우(엣지 케이스 제외)는 malloc(0)를 호출합니다.
Valgrind Memory Check Tool을 사용한 실행 후 분석 결과는 다음과 같습니다.
==16740== Command: ./malloc0
==16740==
p1 = 0x5204040
==16740==
==16740== HEAP SUMMARY:
==16740== in use at exit: 0 bytes in 0 blocks
==16740== total heap usage: 2 allocs, 2 frees, 1,024 bytes allocated
==16740==
==16740== All heap blocks were freed -- no leaks are possible
샘플 코드는 다음과 같습니다.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main()
{
//int i;
char *p1;
p1 = (char *)malloc(0);
printf("p1 = %p\n", p1);
free(p1);
return 0;
}
기본적으로는 1024바이트가 할당됩니다.malloc 크기를 늘리면 할당된 바이트가 1025만큼 증가합니다.
잘못된 인상을 수정하기 위해:
artist = (char *) malloc(0);
돌아오지 않다NULL
와 같지 .artist = NULL;
하여 비교합니다artist
NULL
if (artist == NULL)
이고 거짓이다.if (artist)
정말이에요.
실제로 질문에 대답하기 위해: 그렇게 할 이유가 없습니다.
malloc(0)
는 유효한 메모리주소를 반환하고 그 범위는 메모리를 할당하는 포인터의 유형에 따라 달라집니다.또한 메모리 영역에 값을 할당할 수도 있지만, 이 값은 사용되는 포인터 유형과 같은 범위 내에 있어야 합니다.이치노이치노
int *p=NULL;
p=(int *)malloc(0);
free(p);
the a a a a a a a a a a a a로 합니다.gcc
컴파일러를 사용할 수 있습니다. ~32)의을 지정할 수 문자도 마찬가지입니다., 는 언언 、 음음 、 음음 、 음음 음음음음음 음음 please please please please please please please please 。malloc
★★★★★★★★★★★★★★★ ★★
unsigned char *p=NULL;
p =(char *)malloc(0);
free(p);
p
int 0~255자 int.
리드 콥시의 답변과 malloc의 man page에 따르면, 나는 테스트하기 위해 몇 가지 예를 썼다.그리고 malloc(0)는 항상 고유한 값을 부여한다는 것을 알게 되었습니다.예를 참조해 주세요.
char *ptr;
if( (ptr = (char *) malloc(0)) == NULL )
puts("Got a null pointer");
else
puts("Got a valid pointer");
a pointer가 됩니다.이것은 "Got a valid pointer"(유효한 포인터를 얻었다)를 합니다.ptr
는 늘이 아닙니다.
malloc(0)
코드가 구현 고유의 동작에 의존하지 않는 한 말이 되지 않습니다.코드가 이식 가능한 경우 NULL이 반환되는 것을 고려해야 합니다.malloc(0)
실패가 아닙니다.그럼 NULL을 할당하기만 하면 됩니다.artist
어쨌든, 이것은 유효한 결과이며, 코드도 적고, 유지보수 프로그래머가 시간을 들여 알아내는 일도 없기 때문입니다.
malloc(SOME_CONSTANT_THAT_MIGHT_BE_ZERO)
또는malloc(some_variable_which_might_be_zero)
값이 0일 경우 NULL 반환을 장애로 취급하지 않도록 각별히 주의해야 합니다만, 사이즈는 0이 되어도 괜찮습니다.
물론 이런 구문은 처음 봅니다.전형적인 기능 과잉 살상이라고 할 수 있습니다.Reed의 답변과 함께, 저는 비슷한 것이 있다는 것을 지적하고 싶습니다. 그것은 과부하된 함수처럼 보입니다.realloc
:
- foo는 NULL이 아니며 크기는 0입니다.
realloc(foo, size);
NULL 이외의 포인터와 재할당 사이즈가0인 경우, 재할당은 free(…)를 호출한 것처럼 동작합니다. - foo가 NULL이고 크기가 0이 아닌 1보다 큽니다.
realloc(foo, size);
NULL 포인터를 전달하고 크기가 0이 아닌 경우 재할당은 malloc(…)를 호출한 것처럼 동작합니다.
이게 도움이 되길 바래, 안녕, 톰.
실제로 매우 유용하며(분명히 IMHO) NULL 포인터를 반환하는 허용된 동작은 중단됩니다.동적 포인터는 가리키는 것뿐만 아니라 주소가 고유하다는 사실에도 유용합니다.NULL을 반환하면 두 번째 속성이 삭제됩니다.모든 임베디드 mallocs I 프로그램(실제로 매우 자주)에서 이 동작이 발생합니다.
언급URL : https://stackoverflow.com/questions/2022335/whats-the-point-of-malloc0
'programing' 카테고리의 다른 글
Java에서 Date 개체에서 X일을 빼려면 어떻게 해야 합니까? (0) | 2022.07.19 |
---|---|
Input Stream과 Output Stream이 뭐죠?왜, 언제 사용합니까? (0) | 2022.07.19 |
scanf의 단점 (0) | 2022.07.19 |
Vuex 스토어 상태 변경 시 DOM 업데이트 (0) | 2022.07.19 |
공백 문자를 구분자로 하여 문자열을 분할하는 방법 (0) | 2022.07.19 |