C语言动态分配错误



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

#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 errorn");
        exit(1);
    }
}
void realocate(int *p,int n)
{
    p=(int*)realloc(p,n*n*sizeof(int));
    if(p==NULL)
    {
        printf("Reallocation errorn");
        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("%dt",*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 (exit value 5)

收到信号:SIGSEGV (?) with sigcode ?(?)process: ?对于程序cppapplication_1, pid -1

Visual Studio:

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


如果我删除p=NULL;从main函数中,它说:

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

您的alocate函数正确分配内存,但是返回指向分配内存的指针。你可以像这样修改

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

main函数中,您将像这样使用alocate:

p = alocate(n);

您需要对realocate函数进行类似的更改。

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

如果你想在main函数中更新p,要么传递一个指向p的指针给allocate函数,要么在这个函数中返回p值,如下所示:

int * alocate(int n)
{
    int *p;
    p=(int*)malloc(n*n*sizeof(int));
    if(p==NULL)
    {
        printf("Allocation errorn");
        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函数

我首先注意到的错误是allocate函数只在本地进行分配。改变:

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

这样写:

alocate(&p,n);

reallocate函数做同样的操作。

原因是您将指针作为值传递,而不是"通过引用"传递。这意味着在allocate中,它只是一个普通的局部变量。当函数返回时,对它的所有更改都将丢失。如果你传递指针的地址(&p),它将工作

相关内容

  • 没有找到相关文章

最新更新