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