【发布时间】:2019-10-08 09:18:06
【问题描述】:
有没有办法在 C 中重新分配指向数组的指针,使其指向更小的数组?例如,如果我有一个指针 ptr 最初指向一个大小为 3 的数组 s,并且还存在一个大小为 2 的数组 s1,我是否可以重新分配 ptr 使其指向 @987654325 @ 并因此指向一个较小的数组?
我尝试了以下代码:
void changePtr(double* ptr);
int main()
{
double *ptr;
ptr = (double*)malloc(sizeof(double)*3);
double s[3]={1,2,3};
ptr=s;
changePtr(ptr);
return 0;
}
void changePtr(double* ptr) {
double s1[2]={4,5};
free(ptr);
ptr = (double*)malloc(sizeof(double)*2);
ptr=s1;
}
但是当我在 VIsual Studio 中运行它时,我在 free(ptr) 收到一个错误,上面写着 Debug Assertion failed! Expression: _CrtIsValidHeapPointer(block)
这是为什么?
编辑
新代码是:
void changePtr(double* ptr);
int main()
{
double *ptr;
ptr = (double*)malloc(sizeof(double)*3);
double *s;
s = (double*)malloc(sizeof(double)*3);
s[0]=1; s[1]=2; s[0]=3;
for (int i=0; i<3; i++){
ptr[i]=s[i];
}
changePtr(ptr);
for (int i=0; i<2; i++){
printf("%f\t", ptr[i]);
}
free(ptr);
free(s);
return 0;
}
void changePtr(double* ptr) {
free(ptr);
double *s1;
s1 = (double*)malloc(sizeof(double)*2);
s1[0]=11; s1[1]=12;
ptr = (double*)malloc(sizeof(double)*2);
for (int i=0; i<2; i++){
ptr[i]=s1[i];
}
}
但是当我在调用changePtr 后打印出ptr 的值时,我得到了像-1456815990147....1 这样的垃圾值。这是为什么呢?
【问题讨论】:
-
changePtr() 中的最后一行看起来很可疑。您正在分配一个指向本地创建的数组的指针。当函数返回时,数组将超出范围,因此您指向的内存位置不属于您的程序。最好的办法是附加一个调试器并逐步运行程序。
-
我将新代码粘贴到 OP 中。我现在在
ptr中得到垃圾值。这是为什么呢? -
在 printf 中使用 %f 修饰符,尝试使用 %lf 修饰符并再次检查结果(%f 用于浮点数,双打需要 %lf)。
-
我仍然用
%lf得到垃圾值 -
您是否尝试过在函数返回之前在函数内使用 printf?你还会得到垃圾值吗?
标签: c arrays pointers dynamic heap-memory