你能告诉我我做错了什么吗?
#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
),它将工作