2015-03-21 3 views
-3

Я пытаюсь выделить динамическую память для целого ряда целых чисел в массиве, а затем заполнить массив случайными числами. Проблема в том, что если я делаю это для 5 элементов, он работает ... Если я делаю это для большего, он раздавит, и я не знаю, почему. Вот мой код:Проблема с распределением динамической памяти в C

int main() 
{ 
    int i; 
    int* arr=generateRandomInts(50); 
    printf("Given array:\n"); 
    show(arr,50); 
    return 0; 
} 

int* generateRandomInts(int n) 
{ 
    int i; int *v; 
    v=(int*)malloc(n*sizeof(int)); 
    srand(time(NULL)); 
    for(i=1;i<=n;i++) 
    { 
     v[i]=rand()%200; 
    } 
    return v; 
} 

void show(int *v,int n) 
{ 
    int i; 
    for(i=1;i<=n;i++) 
    { 
     printf("%d ",v[i]); 
    } 
} 
+0

'for (i = 1; i <= n; i ++)' change to 'for (i = 0; i BLUEPIXY

+2

Мне действительно нужно это, чтобы начать с 1, потому что я применяю в этой программе алгоритм сортировки кучи ... но спасибо, что указали это, теперь я знаю, что если я хочу n чисел, я должен выделить память для n + 1. – Sportler

+0

Нет, вам нужны номера 'n', которые вы выделяете для чисел' n'. – juanchopanza

ответ

0

Вам не нужно выделять п + 1 позиции (что попало: P)

Вот вам пример я нашел в Интернете, которые могут быть полезны для вас используя алгоритм сортировки кучи.

/* 
* C Program to sort an array based on heap sort algorithm(MAX heap) 
*/ 
#include <stdio.h> 

int main() 
{ 
    int heap[10], no, i, j, c, root, temp; 

    printf("\n Enter no of elements :"); 
    scanf("%d", &no); 
    printf("\n Enter the nos : "); 
    for (i = 0; i < no; i++) 
     scanf("%d", &heap[i]); 
    for (i = 1; i < no; i++) 
    { 
     c = i; 
     do 
     { 
      root = (c - 1)/2;    
      if (heap[root] < heap[c]) /* to create MAX heap array */ 
      { 
       temp = heap[root]; 
       heap[root] = heap[c]; 
       heap[c] = temp; 
      } 
      c = root; 
     } while (c != 0); 
    } 

    printf("Heap array : "); 
    for (i = 0; i < no; i++) 
     printf("%d\t ", heap[i]); 
    for (j = no - 1; j >= 0; j--) 
    { 
     temp = heap[0]; 
     heap[0] = heap[j]; /* swap max element with rightmost leaf element */ 
     heap[j] = temp; 
     root = 0; 
     do 
     { 
      c = 2 * root + 1; /* left node of root element */ 
      if ((heap[c] < heap[c + 1]) && c < j-1) 
       c++; 
      if (heap[root]<heap[c] && c<j) /* again rearrange to max heap array */ 
      { 
       temp = heap[root]; 
       heap[root] = heap[c]; 
       heap[c] = temp; 
      } 
      root = c; 
     } while (c < j); 
    } 
    printf("\n The sorted array is : "); 
    for (i = 0; i < no; i++) 
     printf("\t %d", heap[i]); 
    printf("\n Complexity : \n Best case = Avg case = Worst case = O(n logn)\n"); 

    return 0; 
} 

Источник: http://www.sanfoundry.com/c-program-heap-sort-algorithm/

Надеется, что это помогает.

+0

'void main' имеет неопределенное поведение; все, что вы делали, было то, что вы скопировали сломанную программу «heapsort» из Интернета. –

+0

Спасибо за ваш комментарий Antii Haapala. Как я уже упоминал в своем посте, это всего лишь пример, и, отвечая на ваш вопрос, да, я скопировал из Интернета источник, о котором я упоминал. Я никогда не хотел об этом признавать (поэтому я поставил источник на этот пост). Что касается основной функции void, я изменил ее на int main(), и я положил 0 в конце, но это не имеет никакого значения в теме темы этого вопроса. Другое дело, почему вы сказали, что это сломанный алгоритм гепсорта? Вы проверили это? – CrApHeR

+0

Я сказал, что программа сломана, а не то, что алгоритм не сломан. –