2014-11-26 2 views
-1

C에서 동적 배열을위한 함수를 만들려고하고 있지만 올바른 방법으로 해결할 수 있을지 확실하지 않습니다. 당신이 나를 도울 수? C의 동적 배열 - 어떻게 작동 시키나요?

array_rows = resizeArray(array_rows,&data); 

이 리뷰 및 팁 주셔서 감사합니다 : 배열이 가득

int resizeArray(int array_rows, int **array[]) 
{ 
    int new_rows = array_rows + 16; 
    int *pointer; 
    pointer = realloc(**array, new_rows*sizeof(int)); 

    if (!pointer) { 
     free(**array); 
     return 0; 
    } 

    **array = pointer; 

    free(pointer); 

    return new_rows; // return new rows counter 

}; 

일부 코드 ....

/* first array definition */ 
    int *data; 
    int array_rows = 16; 
    data = (int*)malloc(array_rows*sizeof(int)); 

경우 : 다음은 내 코드입니다.

편집 :

int resizeArray(int array_rows, int **array){ 
    int new_rows = array_rows + 16; 
    int *pointer; 
    pointer = realloc(**array, new_rows*sizeof(*pointer)); 

    if (!pointer) { 
     free(**array); 
     return 0; 
    } 

    **array = pointer; 

    free(pointer); 

    return new_rows; // return new rows counter 
} 

일부 코드 ....

/* first array use */ 
    int *data; 
    int array_rows = 16; 
    data = (int*)malloc(array_rows*sizeof(*data)); 

배열이 가득 차면

:

array_rows = resizeArray(array_rows,&data); 

편집 - 구조를 갖는 CODE :

struct MyDynamicArray { 
    int maximumSize = 16; 
    int length = 0; 
    int* data; 
} 



    /* first array definition */ 

MyDynamicArray.data = (int*)malloc(MyDynamicArray.maximumSize*sizeof(int)); 


    int resizeArray(int array_rows, struct MyDynamicArray) 
{ 
    int new_rows = MyDynamicArray.maxSize * 2; 
    int *pointer; 
    pointer = realloc(MyDynamicArray.data, new_rows*sizeof(int)); 

    if (!pointer) { 
     free(MyDynamicArray.data); 
     return 0; 
    } 


    MyDynamicArray.maxSize = new_rows; // return new rows counter 

}; 



/* usage */ 
    resizeArray(array_rows,MyDynamicArray); 
012 3,516,

WORKING 해결책 :

resizeArray 함수 정의 :

/** 
* resize array 
*  - its size resize X 2 
* @param max_length 
* @param data 
* @return 
*/ 
int resizeArray(int max_length, int **data) 
{ 
    data = (int *) realloc(**data, max_length * 2 * sizeof(int)); 
    max_length *= 2; 

    return max_length; // return new rows counter 

} 

첫 번째 배열 DEFINITION 여기

int *data_i; 
    int max_length = 16; 
    int *data; 

    data = (int *) realloc((void *) data_i, max_length * sizeof(int)); 

입니다 사용법 :

나는 희망
int i = 0; 
    for(i = 0; i < 100; i++) 
    { 
     data[i] = i; 
     if(i == max_length) 
     {    
      max_length = resizeArray(max_length, &data); 
     } 
    } 

, 그것은 바로 및에 도움이 될 것입니다 someones 문제를 해결하십시오.

+1

? resizeArray INT (INT array_rows, INT ** 어레이) {} – user1870556

+0

를 sizeof (INT)는 (* 포인터) ...가 더를 sizeof 같음 이후에 변수 유형을 변경할 때 크기가 – Quest

+0

인 항목을 변경할 필요가 없으므로 edit i post와 같아야합니다. – user1870556

답변

0

몇 가지 :

그것은 매우 잘 작동 할 수 있지만 당신은 포인터가 미쳐 가고있다. 두 번째 매개 변수는 int * array 일 수 있습니다 (호출 할 때 참조 할 필요가 없습니다). 이렇게하면 free을 호출 할 때와 마찬가지로 realloc을 호출하면 array이 걸리게됩니다. (그리고 당신은 단순히이 array = pointer;

당신은 메모리 관리 기능의 책임이어야한다. 크기를 조정 한 후 배열을 사용하는 줄을 제거하려고하면 당신은 새로 할당 된 메모리를 해제하고

.이 segfault의 원인이됩니다.

당신이 그것을 쓸 때마다 당신에게 항상 전화 resizeArray에 도움이 될 수 있습니다.이 언급

또한, 일반적으로 동적 배열은 realloc이 비싸다. 크기를 두 배로 으로 크기를 조정하지만, 메모리 요즘 저렴 , 그리고 배열의 길이와 당신이 기록한 원소의 양을 더한 값을 넘겨 준다. 지.나는 당신이 당신의 새로운 동적 배열로 무슨 말을하는 건가요 확실하지 않다, 그러나 당신이 뭔가를 유지하는 경우는 가능성이 당신에게 많은 두통을 저장합니다 :

struct MyDynamicArray { 
    int maximumSize; 
    int length; 
    int* data; 
} 
+0

당신의 답변에 많은 감사를드립니다! 그래서 당신의 의견으로는 다음과 같아야합니다 : 'int resizeArray (int array_rows, int * array) { int new_rows = array_rows + 16; int * 포인터; pointer = realloc (** 배열, new_rows * sizeof (* 포인터)); if (!포인터) { 무료 (** 배열); return 0; } return new_rows; 새 행이 } 코드에서 /* 사용 ... */ array_rows = resizeArray (array_rows, &data); ' – user1870556

+0

가 더 좋은 resizeArray (구조체 MyDynamicArray이 * 배열, numberOfElements를 int)를 카운터 반환 // : – bobbybee

+0

가 보자 : new_rows는 여전히 full이 될 때, isFull 검사 (또는 isOverflowing, 절반 크기 일 때 크기가 조정되는 경우가 많음), realloc 역 참조가 필요하지 않으며 둘 다 무료가 아니며 데이터에는 & – bobbybee

0

MyDynamicArray의 많은 반복이 그것을 분별하기 어렵다 최종 접근법. 혼란이있는 부분이 하나 넘습니다 무엇을 재 할당합니까?. 여기에서는 단순히 하나의 MyDynamicArray structint array data 구조체의 멤버 만 재 할당해야합니다. 이를 수행하는 데는 여러 가지 방법이 있지만 처음 배열 크기가 #define 일 경우 data 배열을 initial defined size에 할당 한 다음 요소 수가 에 도달하면 깨끗한 방법으로 배열을 할당합니다.

접근법을 취하는 예제는 다음과 같습니다. struct에 대한 typedef이 타이핑을 줄이기 위해 만들어졌습니다. 코드 불구하고 봐가 어디에 무엇을하고 있는지 이해하고, 추가 질문이 있으면 댓글을 삭제 :

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

#define ARRSZ 5 

typedef struct 
{ 
    size_t size; 
    int* data; 
} MyDynamicArray; 


int *resizeArray (int **mdata, size_t newsize) 
{ 
    int *tmp = realloc (*mdata, newsize * sizeof(int)); 
    if (!tmp) 
     return NULL; 

    *mdata = tmp; 

    return *mdata; 
} 

int main() { 

    MyDynamicArray *mda = malloc (sizeof (MyDynamicArray)); 
    mda->size = ARRSZ; 
    mda->data = malloc (ARRSZ * sizeof (int)); 

    int i = 0; 
    int newsize = 0; 

    for (i = 0; i < 50; i++) 
    { 
     if (i >= mda->size - 1) 
     { 
      newsize = 2 * mda->size; 
      if (resizeArray (&mda->data, newsize)) 
       mda->size = newsize; 
      else { 
       fprintf (stderr, "error: reallocation failed at mda->size: %zd\n", mda->size); 
       exit (EXIT_FAILURE); 
      } 
     } 
     mda->data[i] = i; 
    } 

    printf ("\nElements of dynamic array:\n\n"); 
    for (i = 0; i < 50; i++) 
     printf (" mda->data[%2d] : %d\n", i, mda->data[i]); 

    if (mda->data) free (mda->data); 
    if (mda) free (mda); 

    return 0; 
} 

참고 :이 바람직하다 어떤 이유로 경우 realloc 함수 때 당신은 또한 newpointer을 할당 할 수 있습니다. (예 : int *newptr = resizeArray (&mda->data, newsize);) 그러나 배열의 크기를 간단히 조정하려면 resizeArray (&mda->data, newsize);이면 충분합니다.

출력이 추천

$ ./bin/mydynarray 

Elements of dynamic array: 

    mda->data[ 0] : 0 
    mda->data[ 1] : 1 
    mda->data[ 2] : 2 
    mda->data[ 3] : 3 
    mda->data[ 4] : 4 
    mda->data[ 5] : 5 
    mda->data[ 6] : 6 
    mda->data[ 7] : 7 
    mda->data[ 8] : 8 
    mda->data[ 9] : 9 
    mda->data[10] : 10 
    mda->data[11] : 11 
    mda->data[12] : 12 
    mda->data[13] : 13 
    mda->data[14] : 14 
    mda->data[15] : 15 
    mda->data[16] : 16 
    mda->data[17] : 17 
    mda->data[18] : 18 
    mda->data[19] : 19 
    mda->data[20] : 20 
    mda->data[21] : 21 
    mda->data[22] : 22 
    mda->data[23] : 23 
    mda->data[24] : 24 
    mda->data[25] : 25 
    mda->data[26] : 26 
    mda->data[27] : 27 
    mda->data[28] : 28 
    mda->data[29] : 29 
    mda->data[30] : 30 
    mda->data[31] : 31 
    mda->data[32] : 32 
    mda->data[33] : 33 
    mda->data[34] : 34 
    mda->data[35] : 35 
    mda->data[36] : 36 
    mda->data[37] : 37 
    mda->data[38] : 38 
    mda->data[39] : 39 
    mda->data[40] : 40 
    mda->data[41] : 41 
    mda->data[42] : 42 
    mda->data[43] : 43 
    mda->data[44] : 44 
    mda->data[45] : 45 
    mda->data[46] : 46 
    mda->data[47] : 47 
    mda->data[48] : 48 
    mda->data[49] : 49 
관련 문제