Не работает свободная функция и код всегда падает - PullRequest
0 голосов
/ 21 апреля 2019

Мой код не работает, потому что free () не хочет очищать массив. Прежде всего я создаю массив и добавляю туда числа. После этого я ввожу K (k

`int main() {
    while(1){
    int m,k;
    printf("Enter size of array: ");
    int res;
    do
    {
        res=scanf("%d",&m);
        if(res!=1)printf("it should be a number!");

    }
    while(res!=1);

    int * a = (int*) malloc(m*sizeof(int)); 


    int i;
    for (i = 0; i < m; i++)
    {
        printf("a[%d] = ", i);
            do
            {
            res=scanf("%d", &a[i]);
            flush();
            if(res!=1) printf("it should be a number!\n");
            }
            while(res!=1);
    }

    for (i = 0; i < m; i++)
        printf("%d ", a[i]);

    printf("\nEnter K: ");
    do
    {
    res=scanf("%d",&k);
    flush();
    if(res!=1 || k>m) printf("k<m must be or enter number\n");
    }
    while(res!=1 || k>m);

    int all=k*m;
    for(i=m;i<all;i++)
    {
        a[i] = 0;
    }
    int j;
    int n=0;
    int s[i][j];
    for(i=0;i<m;i++)
    {
    for(j=0;j<k;j++)
    {
    s[i][j] = a[n];
    printf("%d ",s[i][j]);
    n++;
    }
    printf( "\n" );
    }
    for(i=0;i<m;i++)
    {
    for(j=0;j<k;j++)
    {
        free(s[i][j]);
    }
    }   
int povtor;   ----- exit using break
char temp[10];
printf("Continue?(1 - No, everything - Yes): ");
gets(temp);
povtor = atoi(temp);
if (povtor == 1 ) break; 

}
return 0;
}`

Ответы [ 2 ]

1 голос
/ 21 апреля 2019

У вашего кода много проблем.

Во-первых, вы можете только free что-то, что было выделено с malloc, calloc или realloc.Это не относится к s[i][j].

Но это только одна проблема.Вы выделяете a для хранения m элементов:

int * a = (int*) malloc(m*sizeof(int));

, но затем пытаетесь записать после конца массива здесь:

int all=k*m;
for(i=m;i<all;i++)
{
    a[i] = 0;
}

Вам необходимо изменить размер a перед попыткой этого, в противном случае вы перезаписываете память, которой вы не владеете:

int *tmp = realloc(a, sizeof *a * all );
if ( !tmp )
{
  // resize failed, exit with error
}
a = tmp;
for( i = m; i < all; i++ )
{
  a[i] = 0;
}

Тогда есть это:

int j;
int n=0;
int s[i][j];

Какое значение j на данный момент?В этом отношении, каково значение i?Вы уверены, что не имеете в виду s[m][k]?

0 голосов
/ 21 апреля 2019

Вы пытаетесь освободить int, а не указатель: int s[i][j] - это массив массива int, следовательно, s[][] - это int.

Даже если s - автоматическая памятьраспределены: в основном, это переменная, хранящаяся в стеке , поэтому вам не нужно ее освобождать.Попытка освободить статическую переменную приводит к сбою. Этот вопрос может вам помочь.

Кстати, у вас много неинициализированных переменных, что приводит к условным переходам и возможным сбоям: например, вы объявляете int j без значения ипосле того, как вы используете его для объявления массива массива.

Наконец, не используйте get.Эта функция опасна, вместо этого используйте fgets.Я предлагаю вам прочитать справочную страницу, чтобы понять почему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...