0

난 알고리즘을 구현하는 C의 가변 길이 배열을 사용했다. 스택 대신 힙에이 행렬을 할당하는 방법이 있습니까? 그렇지 않으면 int**으로 다시 작성해야합니다.힙에 가변 길이 배열을 만드는 방법은 무엇입니까? I이 말도 치수하지 않는 테스트 관리</p> <pre><code>int matrix[rows][cols]; </code></pre> <p>:

같은 것을 calloc(sizeof(int[rows][cols]), 1)과 같습니까? 이 질문은 가변 길이 배열에 관한 , 특히입니다.

+0

@ user3528438 ** 가변 길이 배열 데이터 유형에 대해 ** 특별히 ** 부탁드립니다. 게다가, 5D, 진지하게? –

+4

5D에서 효과가있는 것은 2D에서 작동하도록 줄일 수 있습니다. 'calloc (sizeof (int [rows] [cols]), 1)'을 시도 했습니까? 어떤 크기를 얻었습니까? 실제로 더 관련이있는 것은'rows','cols'와'sizeof' 표현식의 값을 출력하는 것입니다. 그것은 당신에게 필요한 것을 제공합니까? 질문은 "나는 결과를 어떻게 할당 할까?" –

+0

@ TomášZato 5D? 예, 진지하게! 왜 안돼? –

답변

2

아주 간단 해 보입니다. 유일한 원격으로 까다로운 비트는 동적으로 할당 된 배열에 포인터를 보유하는 유형입니다 :이 코드는 신중하게 배열의 모든 요소를 ​​제로로 calloc()을 사용

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

static void print_matrix(int r, int c, int matrix[r][c]) 
{ 
    for (int i = 0; i < r; i++) 
    { 
     for (int j = 0; j < c; j++) 
      printf(" %d", matrix[i][j]); 
     putchar('\n'); 
    } 
} 

static void set_matrix(int r, int c, int matrix[r][c]) 
{ 
    for (int i = 0; i < r; i++) 
    { 
     for (int j = 0; j < c; j++) 
      matrix[i][j] = (i+1) * 100 + j + 1; 
    } 
} 

int main(void) 
{ 
    size_t rows = 9; 
    size_t cols = 7; 
    size_t size = sizeof(int[rows][cols]); 
    printf("rows = %zu, cols = %zu, size = %zu\n", rows, cols, size); 
    int (*matrix)[cols] = calloc(sizeof(int[rows][cols]), 1); 
    if (matrix != 0) 
    { 
     set_matrix(rows, cols, matrix); 
     print_matrix(rows, cols, matrix); 
     free(matrix); 
    } 
    return 0; 
} 

하고 비 제로로 설정 set_matrix()를 호출 값. 서면으로, malloc()calloc()보다 좋을 것이지만, 질문은 calloc()을 사용하며이 코드와 함께 사용하는 것이 합리적이지는 않을 것입니다 (예 : if (i && j && i != j)과 같은 set_matrix()의 조건부 지정).

예 출력 :

rows = 9, cols = 7, size = 252 
101 102 103 104 105 106 107 
201 202 203 204 205 206 207 
301 302 303 304 305 306 307 
401 402 403 404 405 406 407 
501 502 503 504 505 506 507 
601 602 603 604 605 606 607 
701 702 703 704 705 706 707 
801 802 803 804 805 806 807 
901 902 903 904 905 906 907 
1

당신은 VLA에 대한 포인터를 만들 수 있습니다

T (*arr)[cols] = malloc(sizeof *arr * rows); 

작동하는지 여부를 통해 논쟁이 있습니다

size_t rows, cols; 
... // get values for rows and cols 
T (*arr)[cols] = malloc(sizeof (T [cols]) * rows); 
if (arr) 
{ 
    ... 
    arr[i][j] = some_value; 
    ... 
} 

. 표준 형식이 사용되는 방식에서는 정의되지 않은 동작이 발생합니다. sizeof표현*arr이 VLA를 의미하므로 *arr을 평가해야하고 sizeof *arr을 평가할 때 arr은 잘못된 포인터입니다.

그러나 특정 컨텍스트에서 "평가"의 의미에 따라 달라집니다. 이 가리키는 배열의 크기를 결정하기 위해arr 역 참조 해야 할 이유가 없다 어떤 당신이 고정 길이 배열에 대한 것보다 더 많은 :

T (*arr)[10] = malloc(sizeof *arr * rows); 

I와 몇 가지 다른이의있다 이 점에서 표준이 제대로 표현되지 않았다는 의견과 arr또는 가변 길이 배열을 가리키는 지 여부에 관계없이 sizeof *arr이 유효해야합니다. 이것은 내가 사용하는 숙어이며, 나에게 실패하지 않았다 ... 아직.

그러나이 문제를 지적하지 않고 내가 알고있는 것을 제공하면 좌절 할 것입니다. 은 UB에서이되지 않습니다.