함수에서 이 포인터 반환
함수에서 포인터를 반환하려고 합니다.하지만 분할 오류가 발생하고 있습니다.누가 코드에 무슨 문제가 있는지 말해주세요.
#include <stdio.h>
int *fun();
main()
{
int *ptr;
ptr = fun();
printf("%d", *ptr);
}
int *fun()
{
int *point;
*point = 12;
return point;
}
포인터를 사용하기 전에 메모리를 할당합니다.메모리를 할당하지 않는 경우*point = 12
정의되지 않은 동작입니다.
int *fun()
{
int *point = malloc(sizeof *point); /* Mandatory. */
*point=12;
return point;
}
또한 당신의printf
틀렸습니다.참조를 취소해야 합니다(*
) 포인터.
printf("%d", *ptr);
^
로컬 개체에 포인터를 반환하는 것은 좋지 않은 관행이지만, 여기서 붐을 일으킨 것은 아닙니다.여기에 세그폴트가 발생한 이유가 있습니다.
int *fun()
{
int *point;
*point=12; <<<<<< your program crashed here.
return point;
}
로컬 포인터가 범위를 벗어났지만 실제 문제는 초기화되지 않은 포인터를 다시 참조하는 것입니다.포인트의 가치는 얼마입니까?누가 알겠어요.값이 유효한 메모리 위치에 매핑되지 않으면 SEGFAULT가 표시됩니다. 운 좋게도 올바른 위치에 매핑되면 할당된 위치를 12로 덮어써 메모리가 손상됩니다.
반환된 포인터가 즉시 사용되었기 때문에 이 경우 로컬 포인터를 반환하지 않아도 됩니다.그러나 스택에서 다른 함수 호출이 메모리를 재사용한 후 포인터를 다시 사용하면 프로그램의 동작이 정의되지 않기 때문에 잘못된 관행입니다.
int *fun()
{
int point;
point = 12;
return (&point);
}
또는 거의 동일하게:
int *fun()
{
int point;
int *point_ptr;
point_ptr = &point;
*point_ptr = 12;
return (point_ptr);
}
또 다른 나쁜 관행이지만 더 안전한 방법은 정수 값을 정적 변수로 선언하는 것이며, 그러면 정수 값은 스택에 없을 것이며 다른 함수에 의해 사용되지 않을 것입니다.
int *fun()
{
static int point;
int *point_ptr;
point_ptr = &point;
*point_ptr = 12;
return (point_ptr);
}
또는
int *fun()
{
static int point;
point = 12;
return (&point);
}
다른 사람들이 언급했듯이, 이를 위한 "올바른" 방법은 malloc를 통해 힙에 메모리를 할당하는 것입니다.
정수 포인터에 값 12를 할당할 때 메모리를 할당하지 않습니다.그래서 그것은 어떤 기억도 찾지 못하기 때문에 충돌합니다.
사용해 볼 수 있습니다.
#include<stdio.h>
#include<stdlib.h>
int *fun();
int main()
{
int *ptr;
ptr=fun();
printf("\n\t\t%d\n",*ptr);
}
int *fun()
{
int ptr;
ptr=12;
return(&ptr);
}
제가 알기로는 키워드 new를 사용하는 것은 malloc(식별자 크기)와 비교적 같은 것을 합니다.아래 코드는 new 키워드를 사용하는 방법을 보여줍니다.
void main(void){
int* test;
test = tester();
printf("%d",*test);
system("pause");
return;
}
int* tester(void){
int *retMe;
retMe = new int;//<----Here retMe is getting malloc for integer type
*retMe = 12;<---- Initializes retMe... Note * dereferences retMe
return retMe;
}
언급URL : https://stackoverflow.com/questions/7754986/returning-this-pointer-from-a-function
'programing' 카테고리의 다른 글
Oracle 환경에서 TNS: 청취자란 무엇입니까? (0) | 2023.08.02 |
---|---|
H1 텍스트를 로고 이미지로 대체: SEO 및 접근성을 위한 최선의 방법? (0) | 2023.08.02 |
null을 뷰 루트로 전달하지 않도록 합니다( 부풀린 레이아웃의 루트 요소에서 레이아웃 매개 변수를 확인해야 함). (0) | 2023.08.02 |
내용에 셀 너비 맞춤 (0) | 2023.08.02 |
NodeJS 암호화와 함께 SHA-256 사용 (0) | 2023.08.02 |