2016-09-24 3 views
2

Я новичок, пытающийся научиться создавать массивы динамиков в C. Код не дает мне никаких ошибок, когда я его создаю с помощью кода: блоки, но когда я запускаю его сбой. Я думаю, что авария связана с тем, как я освобождаю свою память, потому что код дает мне желаемый результат перед сбоем.Как я могу освободить память в динамически распределенном массиве?

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

int main() 
{ 

    int i, j; 
    int *p = (int *)malloc(sizeof(*p)); 

    printf("Hello World! I have created a dynamic array of 20x30 integers! \n"); 
    for (i = 0; i <= 19; i++) 
    { 
     p[i] = (int)malloc(sizeof(int*)); 
     printf(" %2d ", i); 
     for (j = i + 1; j <= 29 + i; j++) 
     { 
     p[i] = 0; 
     printf("%2d", j); 
     } 
    printf("\n"); 
    } 

    for (i = 0; i <= 19; i++); 
    { 
     free(p[i]); 
    } 
    free(p); 
    return 0; 
} 
+4

Ваш первый malloc выделяет пространство для одного int. – tkausl

+2

В дополнении 'p [i] = (int) malloc (sizeof (int *));' неверно. 'p [i]' является 'int', а не указателем, поэтому вы не должны хранить там указатель. Во многих системах размер 'int' и указатель различны и, следовательно, код может также вызвать сбой. – kaylum

+0

[фиксированный код] (http://ideone.com/WWiYZL) – BLUEPIXY

ответ

0

В этом проблема.

Во-первых, ваш первый вызов malloc выделяет пространство для массива с 1 элементом.

Вы хотите, чтобы изменить его с

int *p = (int *)malloc(sizeof(*p)); 

в

int *p = (int *)malloc(sizeof(int*) * 20); 

И тогда ваш второй таНос вызов немного неправильно, а также.

p[i] = (int)malloc(sizeof(int*)); 

должен быть изменен на

p[i] = (int *)malloc(sizeof(int)); 

Вы просто поставить звездочку в неправильном месте.

Наконец, вы действительно создаете только 20-элементный массив. Все, что вы делаете во внутреннем цикле for, присваивает каждой ячейке в массиве значение 0 раз. Если вы хотите сделать массив 20x30, вы всегда можете взять легкий маршрут и создать 1D массив и использовать некоторые математические (что, в конечном счете то, что компилятор делает с нединамическими 2D массивами в любом случае):

int main() 
{ 
    int *p = (int *)malloc(sizeof(int) * 600); 
    ... 
    for (i = 0; i <= 19; i++) 
    { 
     printf(" %2d ", i); 
     for (j = 0; j <= 29; j++) 
     { 
      p[i * 30 + j] = 0; // It's i * 30, not i * 20 because you have to skip the space that the 'j' dimension takes up. 
      printf("%2d", j); 
     } 
     printf("\n"); 
    } 

    free((void*)p); //I found the program crashes without the void* cast 
} 

I Я тестировал этот код, и он работает.

Надеюсь, это поможет.

+1

С 'int * p;' 'p [i]' оценивается как 'int'. Вы не хотите хранить указатель (какой результат 'malloc()' is) в 'int'. – alk

+0

Также этот 'p [i] [j]' даже не компилируется. – alk

+0

alk, я написал это в спешке и знал, что у него, вероятно, были ошибки. Я исправил это сейчас, с лучшим решением. – anonymoose

Смежные вопросы