fork download
  1. #include <stdio.h>
  2. #include <stdint.h> // В частности, для uint16_t.
  3.  
  4. int main(void) {
  5. size_t nelem = 15;
  6. // volatile не нужон.
  7. uint16_t *testarray;
  8. // Кастить результат malloc нужно в плюсах, в сишечке void *
  9. // автоматически кастится в любой другой указатель.
  10. // sizeof() лучше делать для дереференснутого указателя, а не
  11. // для типа. Таким образом, если ты сменишь uint16_t на uint32_t,
  12. // код не сломается.
  13. testarray = malloc(sizeof(*testarray) * nelem);
  14. if (!testarray) {
  15. fprintf(stderr, "malloc() failed\n");
  16. exit(1);
  17. }
  18.  
  19. // Как-то используем массив.
  20.  
  21. // Захотели изменить его размер. Объявляем другой указатель, потому что
  22. // realloc() может сфейлиться и вернуть NULL. Если бы мы написали
  23. // testarray = realloc(...), то в таком случае была бы утечка памяти.
  24. uint16_t *temp;
  25. size_t temp_size;
  26.  
  27. temp_size = nelem + 20; // Новая длина массива.
  28. temp = realloc(testarray, sizeof(*testarray) * temp_size);
  29. if (!temp) {
  30. fprintf(stderr, "realloc() failed\n");
  31. // Тут мы можем выйти или продолжить использовать testarray и nelem
  32. // со старым размером.
  33. } else {
  34. testarray = temp;
  35. nelem = temp_size;
  36. }
  37.  
  38. // Используем массив дальше.
  39.  
  40. return 0;
  41. }
  42.  
Success #stdin #stdout 0s 2284KB
stdin
Standard input is empty
stdout
Standard output is empty