1

長さ2の整数配列をメインブロックに返したい非常に基本的なプログラムに取り組んでいます。しかし、それを機能させることはできません。これを行うにはポインターが必要かもしれないと言われました。ポインターはどのように機能し、プログラムでこれをどのように使用できますか? これが私の現在のコードです:

int[] return2();


int main() {

  int a[2];

  a = request();
  printf("%d%d\n", a[0], a[1]);


  return(0);
}

int[] request ()
{
  int a[2];

  a[0] = -1;
  a[1] = 8;

  return a;
}
4

6 に答える 6

6
  • 配列を返す関数を宣言することはできません。

    ISO/IEC 9899:1999

    §6.9.1 関数定義

    ¶3 関数の戻り値の型は、voidまたは配列型以外のオブジェクト型とする。

    C2011 は本質的に同じことを言います。

  • 関数から (非静的) ローカル変数へのポインターを返すべきではありません。戻りが完了するとすぐにスコープ内になくなる (したがって無効になる) からです。

malloc()配列が静的に割り当てられている場合、またはet al.を介して動的に割り当てられている場合は、配列の先頭へのポインターを返すことができます。

int *function1(void)
{
    static int a[2] = { -1, +1 };
    return a;
}

static int b[2] = { -1, +1 };

int *function2(void)
{
    return b;
}

/* The caller must free the pointer returned by function3() */
int *function3(void)
{
    int *c = malloc(2 * sizeof(*c));
    c[0] = -1;
    c[1] = +1;
    return c;
}

または、冒険心があれば、配列へのポインターを返すことができます。

/* The caller must free the pointer returned by function4() */
int (*function4(void))[2]
{
    int (*d)[2] = malloc(sizeof(*d));
    (*d)[0] = -1;
    (*d)[1] = +1;
    return d;
}

その関数宣言に注意してください!その意味を完全に変えるのに大きな変更は必要ありません:

int (*function4(void))[2]; // Function returning pointer to array of two int
int (*function5[2])(void); // Array of two pointers to functions returning int
int (*function6(void)[2]); // Illegal: function returning array of two pointers to int
int  *function7(void)[2];  // Illegal: function returning array of two pointers to int
于 2013-03-12T04:05:32.653 に答える
3

関数から戻る必要がありpointer to array of 2 integersます。#含む

int(* request()) [2]
{
static int a[2];
a[0] = -1;
a[1] = 8;
return &a;
}

int main() {
int (*a) [2];
a = request();
printf("%d%d\n", *(*a+0), *(*a+1));
return 0;
}
于 2013-03-12T04:09:57.640 に答える
3

ポインターがどのように機能するかを理解することをお勧めします。これが(悪い)解決策です:

#include <stdio.h>

int* request(){
    int a[2];
    a[0] = -1;
    a[1] = 8;
    return a;
}

int main() {
    int* a;
    a = request();
    printf("%d%d\n", a[0], a[1]);
    return 0;
}

しかし問題がある。int a[2];inはローカル変数であるためint* request()、返される値が上書きされないという保証はありません。より良い解決策は次のとおりです。

#include <stdio.h>

void request(int* a){
    a[0] = -1;
    a[1] = 8;
}

int main() {
    int a[2];
    request(a);
    printf("%d %d\n", a[0], a[1]);
    return 0;
}
于 2013-03-12T04:05:04.570 に答える
1

int a[2]で宣言する配列requestは、その関数のスコープ内でのみ有効であるため、そのように返すことはできません。一度main取得すると配列は無効になるためです。

ポインターを理解していない場合は、何が起こっているのかを実際に把握する必要がありますが、必要なことを行うコードを次に示します。

int* request();

int main() {

  int* a;  // a is a pointer to an int

  a = request();
  printf("%d%d\n", a[0], a[1]);

  // we have to tell the program that we're done with the array now
  free(a);

  return(0);
}

int* request ()
{
  // allocate space for 2 ints -- this space will survive after the function returns
  int* a = malloc(sizeof(int) * 2);/

  a[0] = -1;
  a[1] = 8;

  return a;
}
于 2013-03-12T04:08:15.790 に答える
1

他の人が提案したように、malloc を介してメモリを割り当ててポインタを返すことができます。次のようなことも考慮する必要があります。

struct values {
    int val1;
    int val2;
};

struct values request();

int main() {

  struct values a;

  a = request();
  printf("%d%d\n", a.val1, a.val2);

  return(0);
}

struct values request ()
{
  struct values vals;

  vals.val1 = -1;
  vals.val2 = 8;

  return vals;
}

構造体は値で渡されて返されます (つまり、コピーされます)。構造体に含まれるデータの種類によっては、より簡単で安全な場合があります。

于 2013-03-12T07:00:34.863 に答える
0

配列を返すには、動的に割り当てる必要があります。

代わりにこれを試してください(変更を観察してください):

int* request();

int main() {    
  int *a;    
  a = (int *)request();
  printf("%d %d\n", a[0], a[1]);        
  return(0);
}

int* request() {
  int *a = malloc(sizeof(int) * 2);    
  a[0] = -1;
  a[1] = 8;    
  return a;
}
于 2013-03-12T04:05:30.680 に答える