C: Ошибка сегментации при использовании printf - PullRequest
5 голосов
/ 04 июня 2010

Возможно, это очень просто, но я не могу заставить его работать.

У меня есть очень простой фрагмент кода:

#include <stdio.h>
#include <string.h>

int main(void)
{

  char buf[100];
  char *p = buf;

  strcpy(p, "Test string");

  printf("%s\n", *p);

}

Что вызывает ошибку сегментации при запуске. Выходы GDB:

Program received signal SIGSEGV, Segmentation fault.
0xb76af3b3 in strlen () from /lib/i686/cmov/libc.so.6

Но я все еще не понимаю.

Комментарии будут оценены, спасибо.

Ответы [ 6 ]

12 голосов
/ 04 июня 2010

Когда вы пишете

printf("%s\n", *p);

, *p будет значением p[0], которое является символом.Однако printf ищет массив символов, что приводит к его сбою.Помните, что в C строки - это просто массивы символов, а массивы фактически являются указателями на первый элемент, поэтому вам не нужно разыменовывать.

Чтобы исправить это, удалите *, чтобы получить:

printf("%s\n", p);
10 голосов
/ 04 июня 2010

Вы передаете символ в printf; Вы должны передать указатель.

char buf[100];
char *p = buf;

strcpy(p, "Test string");

printf("%s\n", p);     // p, not *p
4 голосов
/ 04 июня 2010

Используйте это:

printf("%s\n", p);

используйте «p» вместо «* p»

3 голосов
/ 04 июня 2010

Заменить

printf("%s\n", *p);

с

printf("%s\n", p);

Когда вы используете %s, printf ожидает, что вы передадите char*. Вы передаете char вместо.

2 голосов
/ 04 июня 2010

просто передать строку (указатель):

printf("%s\n", p);

Если вы хотите напечатать первый символ, то:

printf("%c\n", *p);
0 голосов
/ 04 июня 2010

% s вызывает функцию printf () к разыменованию * p.Предположим, что строка была «Тестовая строка».Тогда на моей коробке sparc Solaris: (в тестовой программе) p будет "нацелен" на адрес 0x54657374.Вероятность того, что этот конкретный адрес является частью вашего пространства процесса, близка к нулю.

Именно это вызвало сигнал SIGSEGV (segfault).

...