【发布时间】:2015-08-30 01:10:34
【问题描述】:
我正在尝试使用 realloc() 缩小指针“ptr”,如下示例代码所示:
char * ptr = malloc(sizeof(char) * 7);
int i;
for(i = 0;i<7;i++){
ptr[i]= "pointer"[i];
}
puts(ptr);
ptr = realloc(ptr,sizeof(char) * 3);
puts(ptr);
free(ptr);
期望代码释放未使用的内存,我认为它会返回以下内容:
pointer
poi
但是,它反而返回:
pointer
pointer
这是编译器的错误,还是我对 realloc() 理解的错误?
【问题讨论】:
-
鉴于你的 char * 不是空终止的,我预计恶魔会从你的鼻子飞出。
-
注意:你不能缩小一个指针,但它指向的对象。而且您正在调用未定义的行为,因为您没有在收缩后终止字符串。第一个循环恰好终止了您复制的字符串,但您分配的
char少于要求:也是未定义的行为。 -
@WilliamPursell:
char *永远不会以 NUL 结尾,因为它是一个指针。我想你的意思是它指向的 C 字符串。 -
@Olaf,是的,但是这个 char * 不指向 C 字符串。
-
@Olaf 在我看来,他认为
puts读取到分配的内存块的末尾,而实际上它读取的是一个 C 字符串。
标签: c memory memory-management