Я не могу найти, почему мой код на C не компилируется, а другой выполняется, оба почти одинаковые

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