2015-01-29 5 views
0

следующие работы успешно:Почему перераспределить терпит неудачу с временной указатель

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); 

Почему так что даже если тот же кусок памяти перераспределены?

+0

'символ * оп, op_temp' и' символ * оп, op_temp' одинаковы. Вот почему я не ставил '*' рядом с именем типа (проще ожидать, что оба 'op' и' op_temp' будут указателями). – woytaz

+0

@woytaz Да, вы правы. Извините за ошибку. В моей голове я хотел сказать, что 'char * op, op_temp' понятен, потому что звездочка привязана к переменной, в то время как' char * op, op_temp' является неоднозначной, потому что она похожа на 'char *' будет применяться к обеим переменным. – Chostakovitch

ответ

3

op_temp не является указателем, просто значением символа. Вы должны написать:

char *op, *op_temp; 

или

char* op; 
char* op_temp; 
0

Это потому, что op_temp не является указателем. Вы должны поместить звездочку * рядом с каждым именем переменной, которое вы хотите быть указателем. Как это:

char *op, *op_temp; 
0

Я хотел бы предложить использовать typedef's устранить такие ошибки, как они кодируют правильные типы указателей, как описано ниже:

typedef char *charp; 
charp op, op_temp; 

Теперь над op & op_temp объявлены как указатели O типа char.

3

В соответствии с man page из realloc()

void *realloc(void *ptr, size_t size);

так, первый аргумент должен быть char *.

Ото, в вашем коде,

op = realloc(op, ++len); 

Здесь op имеет тип char *, который является действительным. Но

op = realloc(op_temp, ++len); 

здесь op_temp имеет тип char.

Изменить

char *op, op_temp; 

в

char *op = NULL, *op_temp = NULL; 
Смежные вопросы