-3

次のプロパティを持つ動的テーブルを検討してください。

  • 要素は動的配列に格納されます
  • 容量は動的配列のサイズです
  • サイズが定義されているのは、配列に格納されている要素の数です

この動的テーブルに要素を挿入します。サイズが push_back() の前の容量と等しい場合、2 倍の容量

malloc または calloc 関数を使用しないでください。

入力: (n, 要素)
9
6 7 8 12 4 10 11 1 15
出力:
容量 = 1; サイズ = 1; 要素 = 6
容量 = 2; サイズ = 2; 要素 = 6 7
容量 = 4; サイズ = 3; 要素 = 6 7 8
容量 = 4; サイズ = 4; 要素 = 6 7 8 12
容量 = 8; サイズ = 5; 要素 = 6 7 8 12 4
容量 = 8; サイズ = 6; 要素 = 6 7 8 12 4 10
容量 = 8; サイズ = 7; 要素 = 6 7 8 12 4 10 11
容量 = 8; サイズ = 8; 要素 = 6 7 8 12 4 10 11 1
容量 = 16; サイズ = 9; 要素 = 6 7 8 12 4 10 11 1 15

#include <stdio.h>
int size=0;
int capacity=0;

int * double_capacity(int *a) {
    int l=0;
    if(capacity==0) capacity++;
    capacity=capacity*2;
    int b[capacity];
    for(l;l<size;l++){
        //printf("%d : %d \n",l,a[l]);
        b[l]=a[l];
    }
    return b;
}

int * push_back(int *a,int j) {
    if(size==capacity)
        a=double_capacity(a);
    a[size]=j;
    size++;
    int k=0;
    printf("capacity = %d; size = %d; elements = ",capacity,size);
    for(k=0;k<size;k++) {
        printf(" %d",*(a+k));
    }
    printf("\n");
    return a;
}


main() {
    int *a;
    int n,i,j,k,l;
    scanf("%d",&n);
    int temp[n];
    for(i=0; i<n; i++) {
        scanf("%d",&temp[i]);
    }

    for(i=0; i<n; i++) {
        a=push_back(a,temp[i]);
    }
}


\temp.c: In function 'double_capacity':
temp.c:16:2: warning: function returns address of local variable [-Wreturn-local-addr]
return b;のようなコンパイル エラーが表示されます。
^


これを実行しても

入力を与えたとき
3 3 2 1
出力
容量 = 1; サイズ = 1; 要素 = 3
容量 = 2; サイズ = 2; 要素 = 3 2
容量 = 4; サイズ = 3; 要素 = 3 2 1

入力を与えたとき
5 5 4 3 2 1
出力
容量 = 1; サイズ = 1; 要素 = 5
容量 = 2; サイズ = 2; 要素 = 5 4
容量 = 4; サイズ = 3; 要素 = 5 4 3
容量 = 4; サイズ = 4; 要素 = 0 0 -2128976676 2
容量 = 8; サイズ = 5; 要素 = 0 0 -2128976676 32524 1

4

1 に答える 1

1

これはあなたが望むようには機能しません:

int * double_capacity(int *a) 
{
  int l=0;

  if(capacity==0) 
    capacity++;

  capacity=capacity*2;
  int b[capacity];
  for(l;l<size;l++)
  {
    //printf("%d : %d \n",l,a[l]);
    b[l]=a[l];
  }
  return b;
}

配列は、関数bの存続期間中のみ存在します。double_capacity関数が終了するとb存在しなくなり、その関数へのポインタは無効になります。

この方法では VLA を使用できません。

あなたの指示がrealloc関数について何も言っていないことに気づきました...

編集

malloc標準のメモリ管理関数 ( 、calloc、または)を使用できない場合、realloc私が考えることができる唯一の現実的な代替手段は、独自のメモリ プールを作成し、そこからテーブル要素を割り当てることです。

unsigned char基本的に、次のようにファイル スコープで大きな配列を宣言します。

#define HEAP_SIZE 8192 // 8 KB heap, use whatever size you need
static unsigned char heap[HEAP_SIZE];

次に、この配列のチャンクを取得してテーブルを構築します。利用可能なブロックと割り当てられたブロック、そのアドレスとその配列内のサイズなどを管理するために、いくつかの簿記を行う必要があります。することが。

繰り返しになりますが、私が忘れている、もう少し単純なことがあるかもしれません。現時点ではそれしか思い浮かびません。

于 2015-09-01T20:19:25.747 に答える