2014-01-24 3 views
0

Так что я попробовал этот кодМанипулирование символьные массивы с помощью указателей в C

#include <stdio.h> 
int main(void) 
{ 
     char string[] = "hello world"; 
     char *my_ptr = string; 
     *my_ptr='Y'; 
     printf("the first char of string is %c", *my_ptr); 
} 

OUTPUT_1: -

the first char of string is Y 

Теперь, если я хочу, чтобы напечатать полный scentence в строке ("Yello мир «). Для этого я изменил 7-й линии в: -

printf("the whole string is %s", *my_ptr); 

OUTPUT_2: -

Segmentation fault (core dumped) 

Но если я пытаюсь изменить его к этому: -

printf("the whole string is %s", my_ptr); 

OUTPUT_3: -

the whole string is Yello world 
  1. Может ли кто-нибудь объяснить мне, почему второй случай терпит неудачу? И

  2. Почему третий случай печатает правильно?

Из моего понимания * my_ptr (а также my_ptr оба) имеет адрес первого места, так почему первые один сбой в печати полной строки, в то время как второй один делает хорошо. Я начинающий, поэтому он поможет, если вы сможете подробно объяснить причину такого поведения в этих случаях.

ответ

3

my_ptr имеет тип char * это указатель на первый символ строки.

*my_ptr имеет тип char Это персонаж.

printf Формат опции Строка %s занимает char *, он будет цикл по каждому символу, пока она находит строку разделитель (0):

Во-первых, *my_ptr, будучи У

Тогда *(my_ptr + 1), будучи ч

И так далее ...

При использовании printf с *my_ptr, содержание *my_ptr будет передано printf, как если бы это был указатель на строку. Его значение равно «Y», что составляет 89 в ascii.

printf попытается получить доступ к указателю по адресу 89, считая его допустимым указателем строки, но этот адрес, скорее всего, не читается, и ядро ​​убьет программу, пытающуюся получить доступ к памяти, к которой у нее нет доступа.

+0

Большое спасибо. Вы написали: «my_ptr» имеет «тип char *». Это потому, что мы объявляем это «char * my_ptr » – Sunita

+0

Да, действительно, это так. – Intrepidd

0

Это будет работать:

#include <stdio.h> 
int main(void) 
{ 
     char string[] = "hello world"; 
     char *my_ptr = string; 
     *my_ptr='Y'; 
     printf("the first char of string is %c", *my_ptr); 
     printf("the whole string is %s", my_ptr); 
} 

my_ptr является указателем на всю строку. *my_ptr - значение символа в начале строки.

printf("%s", char*) 
printf("%c", char) 
0

Это:

printf("the whole string is %s", *my_ptr); 

разыменовывает указатель, поэтому он передает значение типа char к printf(), который будет интерпретировать его (из-за %s форматирования спецификатора) в const char *, то есть в качестве указателя для чтения - только символьные данные. Значение указателя - это адрес места в памяти, где хранятся некоторые данные.

Это сделает printf() началом чтения символов с очень низкого адреса, где ваша программа вряд ли будет разрешена для чтения. Таким образом, ошибка сегментации.

+0

Спасибо. Мне очень жаль, но что означает «const char *»? – Sunita

0

В следующем заявлении:

 printf("the whole string is %s", *my_ptr); 

он будет читать содержимое из адреса * my_ptr. Это производит ошибки сегментации (ядро сбрасывали) В то время как в ниже:

 printf("the whole string is %s", my_ptr); 

Строка будет считан из базового адреса строки []. Чтобы прочитать строку, вам необходимо передать базовый адрес, из которого символ должен начинаться, пока не будет найден символ «\ 0».

0

Reasaon находится в C,% s используется для печати строки, но u использует это для печати символа, который приводит к дампу ядра.

А в С, достаточно, чтобы дать базовый адрес, чтобы напечатать все содержимое, нет необходимости использования *addr.

Если и хотят получить доступ к определенному характеру и может сделать это с помощью *(a+0) для печати 1-й символа и * (a+1) для печати 2-го символа и так далее.

Смежные вопросы