2017-05-04 13 views
-3

동적으로 할당 된 배열을 캡슐화하는 구조체를 만들고 싶습니다. 나는 이러한 IntArray 구조체 생성하는 기능이, 그리고0을 할당하지 않은 Calloc()

typedef struct IntArray { 
    int *field; 
    size_t length; 
} IntArray; 

을 : 그것은 다음과 같습니다 (

int main() { 
    size_t size = 10; 
    IntArray *test = createIntArray(size); 

    for (int i = 0; i < size; i++) { 
     printf("%d\n", test[i]); 
    } 
} 

난은 calloc을 기대 : 여기

IntArray *createIntArray(size_t length) { 
    IntArray *output; 

    if ((output = malloc(sizeof(IntArray))) == NULL) { 
     return NULL; 
    } 

    output->field = calloc(length, sizeof(int)); 
    output->length = length; 

    return output; 
} 

을 메인입니다)을 사용하여 0으로 메모리를 초기화하지만 출력이 이상합니다.

screenshot


나는이 숫자는 메모리 주소입니다 생각하지만, 그들은 어디에서 오는? 프로그램을 시작할 때마다 숫자는 변경되지만 1. 및 6. 위치에 머물러 있습니다.

왜 이런 일이 발생합니까?

편집이 :

내가 실수은 calloc 여기에 유래에서의 malloc을 혼합, 문제는 실제로

+0

1)'출력 =은 calloc (길이는 sizeof (INT))': 당신이 할당 int 배열을 인쇄하려면 는 다음을 사용할 수 있습니다 printf ("% d \ n", test-> field [i]);'printf ("% d \ n", test [i] – BLUEPIXY

+0

패턴을 사용할 경우이 버그는 발생하지 않았을 것입니다 ...'output = calloc (length, sizeof * output(); % d \ n ")' –

+3

3)'test [i]'의 타입은'int'가 아니라'IntArray'입니다. – BLUEPIXY

답변

3

당신은 int로 구조체를 인쇄하려고합니다. 좋은 컴파일러는 컴파일러 경고 (gcc를 사용하는 경우 -Wall)를 켜거나 끌면 경고 할 것입니다.

CreateIntArray는 lengthfield 인 단일 을 만듭니다. (IntArray를> '출력 =은 calloc (길이는 sizeof -

int main() { 
    size_t size = 10; 
    IntArray *test = createIntArray(size); 

    for (int i = 0; i < size; i++) { 
     printf("%d\n", test->field[i]); 
    } 
} 
0

변수 유형 IntArray입니다 위의 코드 발생하지만 INT`의 배열을 할당합니다. 따라서 정의되지 않은 동작 버그가 발생합니다.

createIntArray이라는 함수를 사용하면 int array의 배열을 동적으로 생성하는 것이 매우 이상합니다. 예상 한 배열 하나가 아니라 동적으로 배열을 만드는 것입니다. 이것은 호출자가 항상 배열 배열을 사용하도록 강제하기 때문에 이상한 종속성이기도합니다.

아마도 완전히 다른 것을 원할 것입니다. 이 같은 아마 뭔가 :

#include <stdlib.h> 
#include <assert.h> 

typedef struct IntArray { 
    size_t length; 
    int field[]; 
} IntArray; 

IntArray* createIntArray(size_t length) 
{ 
    IntArray* result; 
    result = calloc(1, sizeof(IntArray) + sizeof(int[length])); 
    assert(result != NULL); 

    result->length = length; 
    return result; 
} 

int main (void) 
{ 
    IntArray* array[3]; 
    for(size_t i=0; i<3; i++) 
    { 
    array[i] = createIntArray(10); 
    } 
}