Динамическое размещение в ошибке C - PullRequest
0 голосов
/ 09 декабря 2011

Подскажите, пожалуйста, что я сделал не так?

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


void read(int *p,int n)
{
    int *q,i,j;
    q=p;
    for(i=0;i<n;i++)
        for(j=0;j<n;j++)
        {
            printf("matrix[%d][%d]=",i,j);
            scanf("%d",q);
            q=q+1;
        }
    printf("\n");
}

void alocate(int *p,int n)
{
    p=(int*)malloc(n*n*sizeof(int));
    if(p==NULL)
    {
        printf("Allocation error\n");
        exit(1);
    }
}

void realocate(int *p,int n)
{
    p=(int*)realloc(p,n*n*sizeof(int));
    if(p==NULL)
    {
        printf("Reallocation error\n");
        exit(1);
    }
}

void show(int *p,int n)
{
    int *q,i,j;
    q=p;
    for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++)
        {
            printf("%d\t",*q);
            q=q+1;
        }
        printf("\n");
    }
}

void cleaner(int *p)
{
    free(p);
}
int main() {
    int *p,n;
    p=NULL;
    printf("n=");
    scanf("%d",&n);
    alocate(p,n);
    read(p,n);
    show(p,n);
    realocate(p,2);
    read(p,2);
    show(p,2);
    cleaner(p);
    return 0;
    system("pause");
}

NetBeans (MinGW):

RUN FAILED (значение выхода 5)

Полученный сигнал: SIGSEGV(?) с sigcode?(?) Из процесса:?Для программы cppapplication_1 pid -1

Visual Studio:

Необработанное исключение в 0x5c81e42e (msvcr100d.dll) в Capp.exe: 0xC0000005: место записи нарушения прав доступа 0x00000000.


А если я удалю p = NULL;из основной функции он говорит:

Ошибка проверки времени выполнения # 3 - переменная 'p' используется без инициализации.Необработанное исключение в 0x5b4ee42e (msvcr100d.dll) в Capp.exe: 0xC0000005: Место записи нарушения прав доступа 0xcccccccc.

Ответы [ 3 ]

2 голосов
/ 09 декабря 2011

Ваша alocate функция правильно выделяет память, но не возвращает указатель на выделенную память. Вы можете исправить это так

int *alocate(int n)
{
    int *p=(int*)malloc(n*n*sizeof(int));
    if(p==NULL)
    {
        printf("Allocation error\n");
        exit(1);
    }

    return p;
}

В вашей функции main вы должны использовать alocate следующим образом:

p = alocate(n);

Вам необходимо внести аналогичные изменения в функцию realocate.

0 голосов
/ 09 декабря 2011

Ошибка, которая впервые показалась мне, заключается в том, что функция allocate делает свое размещение только локально. Изменить на:

void alocate(int **p,int n)
{
    *p=(int*)malloc(n*n*sizeof(int));
    if(*p==NULL)
    {
        printf("Allocation error\n");
        exit(1);
    }
}

Назовите это так:

alocate(&p,n);

Сделайте то же самое с функцией reallocate.

Причина в том, что вы передаете указатель как значение, а не «по ссылке». Это означает, что в allocate это просто обычная локальная переменная. Все изменения в нем будут потеряны, когда функция вернется. Если вы передадите адрес указателя (&p), он будет работать.

0 голосов
/ 09 декабря 2011

Вы передаете аргумент указателя "p" по значению в функцию allocate.Это означает, что когда вы впервые вызываете функцию allocate в своей основной функции.Вы передаете значение NULL для выделения.Затем вы устанавливаете параметр p внутри функции allocate, поэтому p получает другое значение, но когда вы возвращаетесь из функции allocate, значение p по-прежнему равно нулю в основной функции.

Если вы хотите обновить p восновной функции, либо передайте указатель на p в функцию allocate, либо верните значение p в этой функции следующим образом:

int * alocate(int n)
{
    int *p;
    p=(int*)malloc(n*n*sizeof(int));
    if(p==NULL)
    {
        printf("Allocation error\n");
        exit(1);
    }
    return p;
}

int main() {
    int *p,n;
    p=NULL;
    printf("n=");
    scanf("%d",&n);
    p = alocate(n);
    read(p,n);
    show(p,n);
    realocate(p,2);
    read(p,2);
    show(p,2);
    cleaner(p);
    return 0;
    system("pause");
}

Функция reallocate должна быть изменена таким же образом.

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