почему следующая c программа выдает ошибку сегментации? - PullRequest
0 голосов
/ 10 января 2020

Я попытался запустить следующую C программу и получил Segmentation fault, я не понимаю, где код неправильный, вывод говорит Program finished with exit code 139.

#include <stdio.h>

int main(void) {
  char *a[] = {"s1","s2"};
  printf("\n S==>>> %s",*a[0]);
}

Ответы [ 5 ]

2 голосов
/ 10 января 2020
   printf("\n S==>>> %s",*a[0]);

должно быть

 printf("\n S==>>> %c",*a[0]);  // *a[0] is of type char

или

 printf("\n S==>>> %s",a[0]); // a[0] is of type char *
1 голос
/ 10 января 2020

Хотя все остальные ответы верны относительно правильного использования, я хочу объяснить, почему именно вы получаете ошибку сегментации.

Код

#include <stdio.h>

int main(void) {
  char *a[] = {"s1","s2"};
  printf("\n S==>>> %s",*a[0]);
}

пытается напечатать строку \n S==>>> s1, но терпит неудачу, особенно из-за ошибки сегментации, поскольку доступ к *a[0] приводит к адресу 0x73, поскольку шестнадцатеричное значение s равно 0x73. И адрес 0x73 не отображается в адресном пространстве вашего процесса, что приводит к segmentation fault, так как вы в основном пытаетесь напечатать строку по адресу 0x73.

1 голос
/ 10 января 2020

Прежде всего правильный код захода на посадку:

#include <stdio.h>
int main(void) {
   char *a[] = {"s1","s2"};
   printf("\n S==>>> %s",a[0]);
}

Во-вторых, вы сохраняете строку "s1" в [0] и строку "s2" в [1]. Так что если вы хотите напечатать строку, это будет как выше.

Если вы попытаетесь добавить указатель * или & перед указателем, тогда он будет указывать на адрес указателя и для печати используется адрес% d. Теперь, если неправильно кодировать, то это непременно покажет ошибку

1 голос
/ 10 января 2020

Линия

printf("\n S==>>> %s",*a[0]);

неверна.

Вы можете написать *a или a[0] (оба эквивалентны), но *a[0] эквивалентно a[0][0], который является просто символом, то есть одним символом. Поскольку вы указали, что печатаете строку в строке формата printf, вы должны указать строку, то есть массив символов с нулевым символом в конце, вместо одного символа.

Если вы хотите напечатать один символ вместо целой строки необходимо указать %c в строке формата printf вместо %s.

1 голос
/ 10 января 2020

Выражение a[0] имеет тип char * из-за объявления массива a.

char *a[] = {"s1","s2"};

Таким образом, выражение *a[0] имеет тип char. Однако спецификатор формата %s ожидает объект типа char *. В результате функция printf рассматривает значение цифры c символа 's' как адрес памяти.

Поэтому вместо этого используйте

printf("\n S==>>> %s", a[0]);

или даже

printf("\n S==>>> %s", *a );

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

...