2017-08-20 8 views
-1

サイズ10の配列を作成すると、残りのスペースが無駄になるように2つの要素だけが配列に格納されます。どうすればこの問題を解決できますか? (データ構造別)どのように使用されていない配列の領域を節約できますか?

+7

の配列を作成しますize 2?それはオプションですか? – Daniele

+3

配列が動的に割り当てられている場合は、単にrealloc()を使用できます。 – Frank

+0

@ Danieleはい、データ構造を使用することでそれを避ける方法はありますか? –

答えて

2

配列の代わりに単純なリンクリストを使用するか、配列を使用する必要がある場合はrealloc()を使用すると、2つのセルだけを使用するように配列が縮小されます。このような10. :

#include <stdio.h> 
#include <stdlib.h> 

int main(void) 
{ 
    int* ptr = malloc(10 * sizeof(int)); 
    ptr[0] = 4; 
    ptr[1] = 13; 
    ptr = realloc(ptr, 2 * sizeof(int)); 
    printf("%d %d\n", ptr[0], ptr[1]); 
    return 0; 
} 

出力:

+1

問題を解決していただきありがとうございます –

+0

@NachiketMore then * accept *私の答えをお願いします。あなたは私の投稿の左側にあるチェックマークをクリックすることでそれを行います。 – gsamaras

1

ほとんどの場合、動的メモリ割り当てが使用されます。これは、最初のメモリ量を取得するためにmallocを呼び出すことを意味し、必要に応じてrealloc、スペースがなくなったらfree、メモリをアリーナに戻すことを意味します。標準入力から行を読み込む関数です。動的に割り当てられたメモリを返します。

#define INITALLOC 16 /* #chars initally alloced */ 
#define ALLOCSTEP 8 /* #chars to realloc by */ 
int getline(char **dynline) 
{ 
    int i, c; 
    size_t nalloced; /* #chars currently alloced */ 

    if ((*dynline = malloc(INITALLOC)) == NULL) 
     return -1; /* return -1 on mem. err */ 
    nalloced = INITALLOC; 
    for (i = 0; (c = getchar()) != EOF; ++i) { 
     /* buffer is full; request more mem */ 
     if (i == nalloced) 
      if ((*dynline = realloc(*dynline, nalloced += STEP)) == NULL) 
       return 0; 
     /* store the newly read character */ 
     (*dynline)[i] = c; 
    } 
    /* zero terminate the string */ 
    (*dynline)[i] = '\0'; 

    if (c == EOF) 
     return 0; /* return 0 on EOF */ 

    return 1; 
} 

この関数のユーザーは、メモリを解放する責任があります。例:

char *buf; 
printf("What is your full name?\n"); 
if (getline(&buf) > 0) 
    puts(buf); 
free(buf); 

もちろん、いくつかの無駄がありますが、配列を使用して解決することは不可能です。リンクリストを検討するhttps://www.cs.cmu.edu/~adamchik/15-121/lectures/Linked%20Lists/linked%20lists.html

関連する問題