为什么 realloc 因临时指针而失败
Why realloc fails with temporary pointer
以下工作成功:
char *op, op_temp;
op = malloc(len+1);
op_temp = op;
op = realloc(op, ++len);
而以下会导致运行时错误:
char *op, op_temp;
op = malloc(len+1);
op_temp = op;
op = realloc(op_temp, ++len);
为什么即使重新分配了同一块内存?
op_temp 不是指针,只是一个 char 值。你应该写:
char *op, *op_temp;
或
char* op;
char* op_temp;
这是因为op_temp
不是指针。您必须将星号 *
放在您希望成为指针的每个变量名称旁边。像这样:
char *op, *op_temp;
我建议使用 typedef's
消除此类错误,因为它们编码正确的指针类型,如下所述:
typedef char *charp;
charp op, op_temp;
现在,上面的 op
和 op_temp
声明为 char
类型的指针。
根据 realloc()
的 man page
void *realloc(void *ptr, size_t size);
所以,第一个参数应该是 char *
.
OTOH,在你的代码中,
op = realloc(op, ++len);
此处op
为char *
类型,有效。但是
op = realloc(op_temp, ++len);
这里 op_temp
是类型 char
.
改变
char *op, op_temp;
到
char *op = NULL, *op_temp = NULL;
以下工作成功:
char *op, op_temp;
op = malloc(len+1);
op_temp = op;
op = realloc(op, ++len);
而以下会导致运行时错误:
char *op, op_temp;
op = malloc(len+1);
op_temp = op;
op = realloc(op_temp, ++len);
为什么即使重新分配了同一块内存?
op_temp 不是指针,只是一个 char 值。你应该写:
char *op, *op_temp;
或
char* op;
char* op_temp;
这是因为op_temp
不是指针。您必须将星号 *
放在您希望成为指针的每个变量名称旁边。像这样:
char *op, *op_temp;
我建议使用 typedef's
消除此类错误,因为它们编码正确的指针类型,如下所述:
typedef char *charp;
charp op, op_temp;
现在,上面的 op
和 op_temp
声明为 char
类型的指针。
根据 realloc()
的 man page
void *realloc(void *ptr, size_t size);
所以,第一个参数应该是 char *
.
OTOH,在你的代码中,
op = realloc(op, ++len);
此处op
为char *
类型,有效。但是
op = realloc(op_temp, ++len);
这里 op_temp
是类型 char
.
改变
char *op, op_temp;
到
char *op = NULL, *op_temp = NULL;