#arrays #string #pointers
#массивы #строка #указатели
Вопрос:
Я не могу понять, почему один код не работает. Мне каким-то образом удалось заставить его работать, внеся в него некоторые изменения, но теперь я не могу понять, в чем проблема. пожалуйста, помогите.
Этот не запущен:
#include<stdio.h>
main()
{
char *name;
int length;
char *cptr = name; //this line is different
name = "DELHI"; //This line is different
printf ("%sn", name);
while(*cptr != '')
{
printf("%c is stored at address %un", *cptr, cptr);
cptr ;
}
length = cptr - name;
printf("nLength of the string = %dn", length);
}
Этот запущен:
#include<stdio.h>
main() {
char *name;
int length;
char *cptr;
name = ("DELHI");
printf("%sn",amp;name);
cptr = name;
while (*cptr != '')
{
printf("%c is stored at address %un", *cptr, cptr);
cptr ;
}
length = cptr-name;
printf("nLength of String = %dn", length);
}
Комментарии:
1. Пожалуйста, правильно отформатируйте свой код; так будет намного проще помочь.
2. Будет справедливо, если вы предоставите ошибки компилятора вместе с вашим образцом кода, если он не компилируется. Также компиляторы обычно довольно хорошо говорят вам, что не так. Например, мой говорит мне, что вы объявили
main
неправильно (должны возвращать int ), вы присвоили символу * const char * (строки, доступные для записи), и вы использовали спецификатор%u
формата, когда должны были использовать%p
.3. извините, я новичок здесь, не знал
Ответ №1:
В вашей первой программе:
char *name;
int length;
char *cptr = name; //this line is different
Здесь name
неинициализировано, и вы копируете это неинициализированное значение в cptr
. Это вызывает неопределенное поведение (наряду с последующим, когда вы фактически используете cptr
).
В вашей второй программе:
char *cptr;
name = ("DELHI");
printf("%sn",amp;name);
cptr = name;
name
инициализируется, поэтому, когда вы копируете это значение cptr
, все готово. К сожалению, ваша printf
строка здесь неверна — я не уверен, как работает ваша программа; может быть, просто повезло. Вы хотите:
printf("%sn", name);
Обе ваши программы вызывают неопределенное поведение при печати значения cptr
в вашем цикле. Исправьте этот оператор печати, чтобы использовать соответствующий спецификатор формата для значения указателя:
printf("%c is stored at address %pn", *cptr, (void *)cptr);