我正在编写一个文件复制程序,其中我遇到了关于realloc()的困难。 请查看以下代码片段(我写的是为了解realloc()的工作情况): -
int main(){
char *p =(char *) malloc ( 10 ),*t;
p = "this is";
if (strlen (p)==7)
{
t = realloc ( p,14);
if ( t==NULL)
{
printf ("no no\n");
}
}
printf("%p\n%p\n%d",p,t,strlen(p));
free (p);
free (t);
return 1;
}
输出
no no //because realloc () is unable to reallocate the memory
00450357 //address of p
00000000 //address of t
那么为什么realloc()无法重新分配内存并将其(地址)分配给t
?
修改 我在Windows中使用代码块。
答案 0 :(得分:7)
您已通过静态字符串的地址覆盖了malloc返回的值。然后realloc接收静态字符串的地址作为重新分配的参数。
char *p =(char *) malloc ( 10 ),*t;
p = "this is";
t = realloc ( p,14);
你可能想要的是:
char *p =(char *) malloc ( 10 ),*t;
strcpy(p, "this is");
t = realloc ( p,14);
答案 1 :(得分:2)
分配到p
后你正在做
p = "this is";
会覆盖malloc()
返回的值。由于p
指向的内存不可自由,realloc()
失败。
复制字符串do
strcpy(p, "this is");
虽然check p
分配了足够的内存,否则请使用
strncpy(p, "this is", length_of_p);
答案 2 :(得分:1)
realloc
的手册页指出,除非realloc
的第一个参数为NULL
,否则必须先前调用malloc
,{{1} },或calloc
。
realloc
上述语句将t = realloc (p, 14);
传递给p
,realloc
指向字符串文字"this is"
,它具有静态存储持续时间,虽然不是const
限定的,但是只读。因此,您的程序会调用未定义的行为。(由于段错误,它在我的计算机上崩溃了。)
此外,当您重新分配p
字符串文字的第一个元素的地址时,您将失去对动态分配的内存的处理,从而导致内存泄漏。
char *p =(char *) malloc ( 10 ),*t;
p = "this is";
您实际需要做的是使用strcpy
将字符串文字的内容复制到动态分配的缓冲区。
// include the required headers
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// explicitly state void in the parameter list of main
int main(void) {
// do not cast the result of malloc
char *p = malloc(10 * sizeof *p);
char *t;
if(p == NULL) {
printf("malloc failed\n");
return 1;
}
// beware of buffer overrun by strcpy
// consider using the safer strncpy if it suits
p = strcpy(p, "this is");
if(strlen(p) == 7) {
// save the result of realloc in t
// in case, realloc fails to allocate
t = realloc(p, 14);
if(t == NULL) {
printf("realloc failed\n");
// handle it
// p points to old buffer
}
else {
t = NULL;
// p points to new buffer
}
}
// after your done with p, free it
free(p);
return 0;
}