Почему печать символа с% s дает ошибку сегментации? - PullRequest
0 голосов
/ 04 апреля 2019

Почему печать символа с% s каждый раз дает ошибку сегментации?

#include <stdio.h>

int main()
{
  char c = 'a';
  printf("%s",c);
    return 0;
}

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

#include <stdio.h>

int main()
{
  char c[2];
  c[0] = 'a';
  c[1] = 'a'; //skipping '\0'
  printf("%s",c); //aa..(then some random output)
    return 0;
}

Извините Если вопрос был глупым, я просто новичок.

Ответы [ 3 ]

3 голосов
/ 04 апреля 2019

Почему печать символа с% s дает ошибку сегментации каждый раз?

Поскольку %s сообщает printf, что аргумент является указателем на строку, и потому что большинство современных систем защищают низкоадресную память от всех обращений (чтобы такие ошибки не оставались незамеченными) .

Когда вы передаете 'a' в printf, он получает значение 0x41 (ASCII код для a), интерпретирует это значение как указатель, который указывает на самая низкая страница памяти, которая защищена от отсутствия доступа -> SIGSEGV.

0 голосов
/ 04 апреля 2019

Это то, что вы собираетесь сделать:

#include <stdio.h>

int main()
{
    char c = 'a';
    printf("%c",c);  /* <<<< use %c instead of %s, read printf(3) */
    return 0;
}

Если вы делаете:

#include <stdio.h>

int main()
{
    char c[2];
    c[0] = 'a';
    c[1] = 'a'; //skipping '\0'
    printf("%s",c); //aa..(then some random output)
    return 0;
}

на этот раз вы передаете printf() указатель (только имя массива c интерпретируется как адрес первого элемента, поэтому его можно передать в printf() с помощью спецификатора формата %s. На этот раз отсутствие \0 заставляет printf() продолжать печатать, пока не получит \0, вы можете изменить свой код на:

#include <stdio.h>

int main()
{
    char c[2];
    c[0] = 'a';
    c[1] = '\0';
    printf("%s",c); // you get only a
    return 0;
}

и вы получите a в виде распечатки.

0 голосов
/ 04 апреля 2019

Из-за% s printf ожидает указатель на строку.Таким образом, во время печати printf пытается печатать с адреса хранилища c (значение c), которое может быть недопустимым (поскольку на самом деле это не адрес), что приводит к segfault.

Вы можете выполнить printf ("% s"и с);// это может привести к некоторым значениям мусора

...