ошибка сегментации в C назначить строку для char - PullRequest
0 голосов
/ 16 февраля 2011
#include <stdio.h>
#include <stdlib.h>
int main()
{
    char a="9jhjhi";
    printf("%s",a);
}

Почему это вызывает ошибку сегментации? Что происходит за экранами?

Ответы [ 8 ]

5 голосов
/ 16 февраля 2011

Вам нужно использовать char *a = "...".

printf при пропуске %s будет проходить через строку в поисках байта 0 / NULL. В вашем случае вы не назначаете строковый литерал для a, и фактически ваш компилятор должен был выдать предупреждение о том, что вы пытались инициализировать char из указателя.

#include <stdio.h>
#include <stdlib.h>
int main()
{
    char *a="9jhjhi";
    printf("%s",a);
}
4 голосов
/ 16 февраля 2011

Ваша ошибка в том, что

char a="9jhjhi";

должно быть

char *a="9jhjhi";

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

%s преобразование в printf предполагает, что вы передаете ему строку, которая должна быть символом *, указывающим на последовательность символов, заканчивающуюся символом 0.Вы передали ему символ, который определенно не соответствует этим требованиям, поэтому совершенно не определено, что произойдет - сбой может быть обычным явлением.

Вы также должны вернуть что-то из метода main () - он объявленвернуть int в конце концов.

1 голос
/ 16 февраля 2011

Вы имеете в виду

char *a = "9jhjhi";

Если это компилируется без предупреждений, настройки вашего компилятора испорчены.Предупреждения от gcc ясно показывают, что происходит:

test.c: In function ‘main’:
test.c:5: warning: initialization makes integer from pointer without a cast
test.c:6: warning: format ‘%s’ expects type ‘char *’, but argument 2 has type ‘int’

Строковый литерал интерпретируется как указатель, который преобразуется (и усекается) в char.

Затем char отправляется в printf как число, но интерпретируется как строка.Поскольку он никак не завершается нулем, printf, вероятно, переполняет память при прохождении через эту "строку".

1 голос
/ 16 февраля 2011

a инициализируется указателем (приведенным к целому числу и усеченным, потому что char имеет размер 3 или 7 байт), который указывает на массив символов (вероятно, где-то в ПЗУ). То, что следует, не определено, но вероятно так: Когда вы передаете его в printf с %s в строке формата, оно принимает значение a (что-то в 0-255) и 3 (или 7) несвязанные байты из стека, получают поддельный адрес и наносят ущерб, обращаясь к чужой памяти.

Использование char *a = ....

1 голос
/ 16 февраля 2011

C не имеет строк, как в String b = new String ();

C имеет массивы типа char.

Так что char a = "123123" должен быть массивом символов.

Вы также не используете ничего из stdlib.h в этом коде, поэтому нет причины включать его

Редактировать: да, что ни сказал тоже. Имя массива является указателем.

0 голосов
/ 16 февраля 2011

Эту ошибку можно удалить двумя способами.

1.char * p = "karthik A"

2.char [] p = "karthik A"

0 голосов
/ 16 февраля 2011

Прежде всего, вы пытаетесь сохранить всю строку в одну переменную char. Вместо этого используйте char массив (char [size]). Вы также можете захотеть завершить строку с помощью «\ 0».

0 голосов
/ 16 февраля 2011

Когда вы объявляете char a без символа указателя, вы выделяете в стеке достаточно места только для одного символа.

Строки в C представлены массивом char или указателем намассив char, оканчивающийся нулевым символом '\0'.Но если вы используете буквальную строку, компилятор позаботится обо всем этом за вас.

Вот как вы можете заставить свой код работать, затем:

#include <stdio.h>
#include <stdlib.h>
int main()
{
    char *a = "9jhjhi";
    printf("%s",a);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...