Вы увеличиваете ptr
, поэтому меняете адрес, на который он указывает. Вы не можете сделать это.
В вашем случае, используйте отдельный указатель, скажем, char * p = ptr
и выполняйте свои операции с p
, оставляя ptr
без изменений, чтобы вы могли free(ptr)
позже.
РЕДАКТИРОВАТЬ Взглянув еще раз на ваш код, я обнаружил, что вы делаете ptr++
, когда вы не должны. Вы получаете доступ к символам в массиве, например ptr[i]
, если вы путаетесь с указателем ptr
, вы изменяете базовый адрес, а доступ к символам с помощью ptr[i]
может привести (и приведет) к неожиданным результатам.
Если вы просто удалите эту строку (ptr++
), ваш код будет работать магическим образом.
Если вы хотите изучить концепцию указателя и попробовать другое решение, ваш код может выглядеть примерно так:
int main(int argc, char *argv[]){
char *ptr = NULL;
char * p;
ptr = (char *) malloc(LEN+1);// +1 for string (please check for NULL)
p = ptr;
strcpy(ptr, "hello");
int i = 0;
while (*p) // note how I changed it to a while loop, C strings are NULL terminated, so this will break once we get to the end of the string. What we gain is that this will work for ANY string size.
{
printf("ptr[%d] = %c\n", i++, *p); // here i dereference the pointer, accessing its individual char
p++;
}
free(ptr);
return 0;
}