programing

함수에서 이 포인터 반환

newstyles 2023. 8. 2. 08:53

함수에서 이 포인터 반환

함수에서 포인터를 반환하려고 합니다.하지만 분할 오류가 발생하고 있습니다.누가 코드에 무슨 문제가 있는지 말해주세요.

#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