2016-06-21 3 views
2

나는 C에서 함수에서 다른 포인터에 저장된 4 포인터를 반환하려고하는데, 나는 세그먼트 오류가 발생합니다. 누구든지이 작업을 수행하는 방법을 알고 있습니까? 내가이 일을 시도 방법함수에서 여러 포인터를 반환

:

//declaration of 5 pointers (int * ptr0, float * ptr1, ..., int * ptr4) 

int * function() 
{ 
    int * ptr; 
    ptr = malloc(sizeof(int)*4); 

    float * ptr1; 
    ptr1 = malloc(sizeof(float)*4); 

    float * ptr2; 
    ptr2 = malloc(sizeof(float)*4); 

    float * ptr3; 
    ptr3 = malloc(sizeof(float)*4); 

    int * ptr4; 
    ptr4 = malloc(sizeof(int)*4); 

    retunr ptr; 
} 

ptr0 = function(); 
ptr1 = ptr0[0]; 
ptr2 = ptr0[1]; 
//and so on... 

좋아, 내 프로그램을 변경하지만 지금은 더 이상 포인터에 쓸 수 없습니다. 나는 이것이 정말로 '어리석은'질문 인 것을 안다. 그러나 나는 정말로 모른다. 누군가 도움을 줄 수 있습니까?

+0

여러 값을 반환하려는 경우 구조체를 반환하거나 매개 변수 목록을 통해 반환 할 수 있습니다. – iedoc

+0

선언을 포함하여 전체 코드를 표시하십시오. – s7amuser

+0

가능한 복제본 : http://stackoverflow.com/questions/9144516/out-parameters-in-c –

답변

4
void ** function() 
{ 
    void ** ptr; 
    ptr = (void **)malloc(sizeof(void *)*4); 

    ptr[0] = malloc(sizeof(float)*4); 
    ptr[1] = malloc(sizeof(float)*4); 
    ptr[2] = malloc(sizeof(float)*4); 
    ptr[3] = malloc(sizeof(int)*4); 

    return ptr; 
} 
+0

Im 이것을 확인해 보겠다. – noName

+1

@noName는'ptr0 [x]'가 ** void ** 포인터임을주의해야한다. 'int'와'float's로 작업하도록 캐스팅해야합니다. – mvidelgauz

+1

C로 캐스팅 할 필요가 없습니다. – alk

1

* ptr을 채우지는 않았지만 그렇게하지 마십시오. std::tuple<> 또는 std::pair<> 쌍을 사용하거나 구조체를 반환하십시오.

편집 : 더 이상 C++이 아니므로 4 개의 필드가있는 구조체 만 반환하십시오.

+0

'더 이상 C++이 아니므로 네 개의 필드가있는 구조체 만 반환하십시오. 'C++에서도 마음껏 추천할만한 곳이 무엇입니까? 왜냐하면 회원들에게 설명적인 이름을 부여하기 때문입니다. – user2079303

+0

@ user2079303 : C++에서 std :: tie (ptr1, ptr2, ptr3, ptr4) = function()이라고 말하면됩니다. 그렇다면 그렇습니다. – lorro

8

함수에서 단일 값만 반환 할 수 있습니다. 간단한 해결책은 원하는 포인터가 들어있는 구조체를 반환하는 것입니다.

struct pointers { 
    float* ptr1; 
    float* ptr2; 
    float* ptr3; 
    // or perhaps an array instead: 
    // float* f_ptrs[3]; 
    int* ptr4; 
} 

struct pointers function() { 
    struct pointers p; 
    // initialize the members here 
    return p; 
} 
2

당신이 void** (기본적으로, 당신은 다음 캐스트 void*의 배열에 대한 포인터), 당신은 할당 한 후, 포인터를 포함하는 구조체를 선언 할 수 및 수익을 반환 할 수, 세 가지 선택이 있습니다 이러한 구조체에 대한 포인터 (호출자가 구조체를 할당 해제하도록) 또는 을 사용하고 할당 된 메모리를 *ptr0에 할당 할 수 있습니다. ...

상황에 따라 완벽하지 않습니다. 솔루션 2 또는 솔루션 3 중 하나를 선택합니다. 모든 관련 캐스트를 기억하고 컴파일러에서 유형을 지원하는 것이 좋은 생각입니다.

1

는 내가 그것을 언급되지 않았다 보았다,하지만 당신은 함수에 이중 포인터를 전달하고, 함수를 작성 여러 값을 반환하는 또 다른 방법 할 수 :

void function(int** p1, float** p2, float** p3, float** p4, int** p5) 
{ 
    *p1 = malloc(sizeof(int)*4); 

    *p2 = malloc(sizeof(float)*4); 

    *p3 = malloc(sizeof(float)*4); 

    *p4 = malloc(sizeof(float)*4); 

    *p5 = malloc(sizeof(int)*4); 
} 

int* ptr1; 
float* ptr2; 
float* ptr3; 
float* ptr4; 
int* ptr5; 

function(&ptr1, &ptr2, &ptr3, &ptr4, &ptr5); 
+3

C로 캐스팅 할 필요가 없습니다. – alk

+2

캐스팅은 캐스팅하지 않을 때 컴파일러가 캐치 할 수있는 오류를 숨길 수 있습니다. – pmg

+0

아. 내 잘못됨, 보통 C++로 작업합니다. 캐스팅을 제거합니다. 감사합니다. – iedoc

1

무엇 이것에 대해 :

#include <stdlib.h> 
#include <stdio.h> /* for perror() */ 


int function(void ** ptrs, size_t n) 
{ 
    int result = -1; 

    pptrs[0] = malloc(...); 
    if (NULL == ptrs[0]) 
    { 
    goto err; 
    } 

    ... 

    ptrs[n - 1] = malloc(...); 
    if (NULL == ptrs[n - 1]) 
    { 
    goto err; 
    } 

    result = 0; 

err: 

    return result; 
} 

int main(void) 
{ 
    size_t n = 5; 
    void * ptrs[n]; 
    for (size_t i = 0; i < n; ++n) 
    { 
    ptrs[n] = NULL; 
    } 

    if (-1 == function(ptrs, n)) 
    { 
    perror("function() failed"); 
    exit(EXIT_FAILURE); 
    } 

    /* Do stuff. */ 

    /* Free memory where ptrs' are pointing to. */ 

    return EXIT_SUCCESS; 
} 

것은 블라스는 것으로 변화를 main()의 시작을 지원하지 않는 경우 :

#define N (5) 

int main(void) 
{ 
    size_t n = N; 
    void * ptrs[N] = {0}; 

    if (-1 == function(ptrs, n)) 
    { 
    ... 
관련 문제