Неправильное динамическое распределение памяти для больших значений - PullRequest
0 голосов
/ 24 ноября 2018

В приведенном ниже коде я принимаю n в качестве пользовательского ввода, и в зависимости от его значения я выделил память для массива указателей (оба указателя n и массив является частью структуры).Весь код хорошо работает для значений n ниже 4, любых значений 4 и выше, что приводит к ошибке сегментации при вводе значений в массив указателей.

Я могу себе представить, что это может быть из-за того, что память не распределяется, но почему она не превышает 4, я не понимаю

Вот фрагмент, где происходит проблема.

#include <stdio.h>
#include <stdio_ext.h>
#include <stdlib.h>
// static int n;
typedef struct test_case {
  int n;
  int *test[];
} testCase;

int maxsc(testCase *test_case_ptr);
int find_maximum(int *ptr, int n);

int main() {
  int T;
  int x = 0;
  int temp;
  testCase *test_case_ptr;
  printf("T = ");
  scanf("%d", &T);
  printf("\n");
  for (int i = 0; i < T; i++) {
    printf("N = ");
    scanf("%d", &test_case_ptr->n);
    temp = test_case_ptr->n;
    printf("\n");
    test_case_ptr = (testCase *)malloc(sizeof(struct test_case));
    for (int i = 0; i < temp; i++) {
      test_case_ptr->test[i] = malloc(sizeof(int *) * test_case_ptr->n);
    }
    test_case_ptr->n = temp;
    // printf("%d\n", test_case_ptr->n);
    printf("give values\n");
    for (int j = 0; j < test_case_ptr->n; j++) {
      for (int k = 0; k < test_case_ptr->n; k++) {
        scanf("%d", &test_case_ptr->test[j][k]);
      }
    }
    int max_score = maxsc(test_case_ptr);
    printf("\n");
    printf("The max_score_%d = %d \n", x++, max_score);
}

}

1 Ответ

0 голосов
/ 24 ноября 2018

Сначала вы пытаетесь использовать структуру test_case_ptr, прежде чем выделять для нее mem.Во-вторых, при использовании гибкого массива вам нужно выделить для него mem, когда вы используете malloc для структуры.

scanf("%d", &temp);
// Allocate mem for the struct plus the array
test_case_ptr = malloc(sizeof(struct test_case) + sizeof(int *) * temp);
test_case_ptr->n = temp;
// Allocate each row in the array
for (int i = 0; i < test_case_ptr->n; i++) {
  test_case_ptr->test[i] = malloc(sizeof(int) * test_case_ptr->n);
}
// .....
...