LINUX.ORG.RU

Ламерский вопрос по С


0

0

Народ! обьясните почему не работает след прога - компиляция без warning - а при выполнении - segmentation fault #include <stdio.h> main () { void test(char *); char *trace = "ssssssssssssssssssss" ; test(trace); printf ("%s\n", trace); return 0; } void test(char *a) { *a = 'A'; } Что делаю не правильно? Хочу в строке trace в качестве первого символа поставить букву "A".

anonymous

Re: Ламерский вопрос по С

Поменяй 
char *trace = "ssssssssssssssssssss";
на 
char trace[] = "ssssssssssssssssssss";

А лучше -- вообще так не делай :))

asd ()

Re: Ламерский вопрос по С

Строку нулем закончи

anonymous ()

Re: Ламерский вопрос по С

Каким ещё нулём? Всё правильно asd написал.

justme ()

Re: Ламерский вопрос по С

Это я кто задал вопрос. Пасибо asd, все заработало - но главного я так и не понял - в чем же отличие между char a [] и char *aPtr ? Почему же работает след. вариант: #include <stdio.h> main() { char *aPtr = "my_string"; char a [] = "my_string"; printf ("%s\n", a); printf ("%s\n", aPtr); return 0; } ~

anonymous ()

Re: Ламерский вопрос по С

Это опять я кто задал вопрос. Всем пасибо - понятно - в какой-то книженке нашел: " Если переменная типа char* инициализируется строковым литералом, то НЕКОТОРЫЕ КОМПИЛЯТОРЫ могут поместить эту строку в **НЕИЗМЕНЯЕМУЮ** область памяти."

anonymous ()

Re: Ламерский вопрос по С

"в чем же отличие между char a [] и char *aPtr":
отличий почти нет.
abc[1] это есть *(abc+1) где abc - поинтер (pointer).
abc[n] есть *(abc+n)....
короче адресс + смещение есть массив.

logIN ()

Re: Ламерский вопрос по С

Мне кажется, что нужно передавать указатель на указатель. Иначе *переданная_строка будет указывать на какой-то байт в стеке текущей процедуры и соотв. будет ерор

Banshee ()

Re: Ламерский вопрос по С

То есть другими словами, переменная aPtr будет локальной

Banshee ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.