0

我正在调整数组的指针以避免向后复制数组的所有内容。问题是我想在某个时候释放数据,这将产生分段错误,除非我将指针移回它的原始地址。有没有办法避免这种情况?因为如果移位是在函数内部执行的,调用函数可能不知道移位的幅度。

例子:

int i;
float * y = malloc(10*sizeof(float));

for(i=0;i<10;i++) y[i] = (float)i;

y += 2; 

for(i=0;i<8;i++) printf("%d\n",y[i]);

free(y); // this will generate a segmentation fault
y -= 2; free(y); // this is OK, but I would like to avoid it

我对这里的期望是不是太高了?

4

4 回答 4

4

这是不可能的。传递给的指针free()必须从动态分配函数之一返回。从free()参考页面:

释放先前由 malloc()、calloc() 或 realloc() 分配的空间。如果 ptr 是空指针,该函数什么也不做。

如果 ptr 与 malloc()、calloc() 或 realloc() 之前返回的指针不匹配,则行为未定义。此外,如果 ptr 引用的内存区域已被释放,即已以 ptr 作为参数调用 free() 或 realloc() 并且没有调用 malloc()、calloc() 或realloc() 之后产生一个等于 ptr 的指针。


因为如果移位是在函数内部执行的,调用函数可能不知道移位的幅度。

如果指针是按值传递的,那么调用者将看不到对指针的任何修改:

void f(char* a_ptr) { a_ptr++; }

char* p = malloc(10);
f(p);
free(p); /* Valid as no change was made to 'p'. */
于 2013-04-26T13:19:04.117 回答
1

您可以使用不同的变量:

int i;
float * y = malloc(10*sizeof(float));

for(i=0;i<10;i++) y[i] = (float)i;

float *y2 = y+2;

for(i=0;i<8;i++) printf("%d\n",y2[i]);

free(y);
于 2013-04-26T13:18:37.993 回答
1

float * z = y在 malloc 之后做,free(z)最后,

于 2013-04-26T13:19:11.163 回答
1
int i;
float *y = malloc(10*sizeof(float));

for(i=0;i<10;i++) y[i] = (float)i;

//y += 2; 
float *y2 = y + 2;
for(i=0;i<8;i++) printf("%f\n",y2[i]);

y=realloc(y, 2*sizeof(float));//do free y[2]..y[9]

free(y);//finally
于 2013-04-26T13:27:42.280 回答