C错误中的动态分配

时间:2011-12-09 13:13:42

标签: c malloc

你能告诉我我做错了什么吗?

#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)

收到信号:带sigcode的SIGSEGV(?)? (?) 从过程:? 对于程序cppapplication_1,pid -1

Visual Studio:

Capp.exe中0x5c81e42e(msvcr100d.dll)的未处理异常:0xC0000005:访问冲突写入位置0x00000000。


如果我删除p = NULL;从主要功能,它说:

运行时检查失败#3 - 正在使用变量'p'而未初始化。 Capp.exe中0x5b4ee42e(msvcr100d.dll)的未处理异常:0xC0000005:访问冲突写入位置0xcccccccc。

3 个答案:

答案 0 :(得分:2)

您的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功能进行类似的更改。

答案 1 :(得分:0)

您正在通过值将“p”指针参数传递给allocate函数。 这意味着当您在main函数中第一次调用allocate函数时。您将NULL值传递给allocate。然后在allocate函数中设置p参数,因此p被赋予另一个值但是当你从allocate函数返回时,p的值在main函数中仍为null。

如果要在main函数中更新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");
}

应该以相同的方式修改重新分配功能。

答案 2 :(得分:0)

首先出现的错误是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),它将起作用。