簡體   English   中英

從函數返回多個指針

[英]Return multiple pointers from function

我正在嘗試返回4個指針,這些指針存儲在來自C中函數的另一個指針中,但是我得到了分段錯誤。 有誰知道怎么做?

這就是我嘗試這樣做的方式:

//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...

好的,我改變了我的程序,但現在我不能再寫指針了。 我知道這是一個非常“愚蠢”的問題,但我真的不知道。 有人可以幫忙嗎?

您只能從函數返回單值。 一個簡單的解決方案是返回包含所需指針的結構。

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;
}
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;
}

有三種選擇,你可以返回一個void** (基本上是一個指向你之后轉換的void*數組的指針),你可以聲明一個包含指針的結構,然后分配並返回一個指向這樣一個結構的指針(然后讓調用者取消分配結構)或者你可以使用func(float **ptr0, float **ptr1, float **ptr2, int **ptr3)並將你的malloced內存分配給*ptr0 ,...

這些都不是完美的,取決於我會選擇解決方案2或解決方案3的情況,因為它最終會弄亂所有相關的演員陣容,並允許編譯器幫助您使用類型是一個好主意。

你沒有填寫* ptr,但即使你這樣做,也不要這樣做。 使用std::tuple<>std::pair<> s std::pair<> - 或返回一個結構。

編輯:因為它不再是C ++,只需返回一個包含四個字段的結構。

我看到它沒有被提及,但你也可以將雙指針傳遞給函數並讓函數填充它們,這是另一種返回多個值的方法:

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);

那這個呢:

#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;
}

如果不支持VLA,請將main()的開頭更改為:

#define N (5)

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

  if (-1 == function(ptrs, n))
  {
    ...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM