проблема с заполнением массива указателей случайными числами, инициализированными calloc - PullRequest
0 голосов
/ 19 марта 2019
  1. моя программа должна создать 10 векторов, каждый со случайным измерением от 1 до 10 и каждое измерение, заполненное случайными числами от 0 до 24.

    int * makeVector(int dimension) {
      int * Vector = NULL;
    
      Vector = (int*) calloc(dimension - 1, sizeof(int));
      if (NULL == Vector) exit(1);
    
      srand(time(0));
    
      for (int i = 0; i < (dimension - 1); i++) {
        Vector[i] = rand() % 25;
      }
    
      return Vector; 
    }
    
    int main() {
      srand(time(0));
    
      for (int i = 1; i <= 10; i++) {
        printf("-----%d. Vector-----\n", i);
        fflush(stdout);
        int dimension = (rand() % 10) + 1;
        int *Vector = NULL;
    
        memcpy(Vector, makeVector(dimension), dimension);
    
        for (int k = 1; k <= dimension; k++) {
          printf("%d. Dimension: %d\n", k, Vector[k - 1]);
        }
        if (Vector) {
          free(Vector);
          Vector = NULL;
        }
      }
      return 0;
    }
    
  2. Моя проблема: здесь нет предупреждений и ошибок!Хотя For-Loop в функции makeVector, похоже, не работает вообще.

    for (int i = 0; i < (dimension - 1); i++) {
         Vector[i] = rand() % 25;
    }
    

int i в первый раз равен 0, и ничего не происходит.Цикл For-Loop пропускается, и программа завершается со значением выхода: -1.073.741.819

PS: Я довольно новичок в программировании ... может неправильно интерпретировать отладчик.

Спасибо зазаранее!

1 Ответ

0 голосов
/ 19 марта 2019

Ваша главная проблема:

memcpy(Vector, makeVector(dimension), dimension);

, а Vector - нулевой указатель, поэтому поведение не определено

сделать

Vector = makeVector(dimension);

Другая проблема состоит в том, чтобы повторить srand(time(0));, это makeVector , время выполнения практически ничто, поэтому вы повторно инициализируете случайную генерацию, чтобы снова получить те же значения (почти нет изменений, чтобы иметь время меняется).

Делать srand(time(0)); только один раз за выполнение


В

for (int k = 1; k <= dimension; k++) {
  printf("%d. Dimension: %d\n", k, Vector[k - 1]);
}

вы получаете доступ к неинициализированной последней записи вектора, потому что в makeVector :

for (int i = 0; i < (dimension - 1); i++) {
    Vector[i] = rand() % 25;
 }

должно быть

for (int k = 1; k < dimension; k++) {
  printf("%d. Dimension: %d\n", k, Vector[k - 1]);
}

или, конечно, изменить цикл инициализации, чтобы не потерять последнюю запись


Компиляция и выполнение после изменений:

pi@raspberrypi:/tmp $ gcc -pedantic -Wextra m.c
pi@raspberrypi:/tmp $ ./a.out
-----1. Vector-----
1. Dimension: 18
2. Dimension: 21
3. Dimension: 22
4. Dimension: 21
5. Dimension: 2
6. Dimension: 0
7. Dimension: 24
-----2. Vector-----
1. Dimension: 20
2. Dimension: 24
3. Dimension: 13
-----3. Vector-----
1. Dimension: 3
-----4. Vector-----
1. Dimension: 5
2. Dimension: 24
3. Dimension: 10
4. Dimension: 4
5. Dimension: 20
-----5. Vector-----
1. Dimension: 19
2. Dimension: 7
3. Dimension: 24
4. Dimension: 24
5. Dimension: 16
6. Dimension: 11
-----6. Vector-----
1. Dimension: 10
2. Dimension: 14
3. Dimension: 17
4. Dimension: 9
5. Dimension: 9
-----7. Vector-----
1. Dimension: 9
2. Dimension: 8
3. Dimension: 19
4. Dimension: 9
5. Dimension: 7
-----8. Vector-----
1. Dimension: 6
2. Dimension: 8
3. Dimension: 23
-----9. Vector-----
1. Dimension: 14
2. Dimension: 13
3. Dimension: 12
4. Dimension: 13
-----10. Vector-----
1. Dimension: 18
2. Dimension: 10
3. Dimension: 3
4. Dimension: 12
5. Dimension: 20
pi@raspberrypi:/tmp $ 

Исполнение под valgrind

pi@raspberrypi:/tmp $ valgrind ./a.out
==29590== Memcheck, a memory error detector
==29590== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==29590== Using Valgrind-3.13.0 and LibVEX; rerun with -h for copyright info
==29590== Command: ./a.out
==29590== 
-----1. Vector-----
1. Dimension: 21
2. Dimension: 16
3. Dimension: 3
4. Dimension: 11
5. Dimension: 11
6. Dimension: 8
7. Dimension: 13
8. Dimension: 8
9. Dimension: 23
-----2. Vector-----
1. Dimension: 11
2. Dimension: 3
3. Dimension: 5
4. Dimension: 21
5. Dimension: 18
6. Dimension: 4
-----3. Vector-----
1. Dimension: 20
2. Dimension: 15
3. Dimension: 4
4. Dimension: 17
5. Dimension: 0
6. Dimension: 2
7. Dimension: 21
-----4. Vector-----
1. Dimension: 24
2. Dimension: 6
3. Dimension: 20
4. Dimension: 10
5. Dimension: 1
6. Dimension: 19
-----5. Vector-----
1. Dimension: 19
2. Dimension: 24
3. Dimension: 19
-----6. Vector-----
1. Dimension: 7
2. Dimension: 10
-----7. Vector-----
1. Dimension: 5
2. Dimension: 6
3. Dimension: 4
4. Dimension: 10
5. Dimension: 11
6. Dimension: 2
7. Dimension: 4
-----8. Vector-----
1. Dimension: 0
2. Dimension: 1
-----9. Vector-----
1. Dimension: 6
2. Dimension: 18
3. Dimension: 12
4. Dimension: 10
5. Dimension: 16
-----10. Vector-----
==29590== 
==29590== HEAP SUMMARY:
==29590==     in use at exit: 0 bytes in 0 blocks
==29590==   total heap usage: 11 allocs, 11 frees, 1,212 bytes allocated
==29590== 
==29590== All heap blocks were freed -- no leaks are possible
==29590== 
==29590== For counts of detected and suppressed errors, rerun with: -v
==29590== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 6 from 3)
...