LINUX.ORG.RU

Три вопроса по си


0

0

1) зацените код код ниже. Ф-ция f должна изменить переданную ей строку. У меня есть обычная строка (char s[10]), и я передаю ее адрес (&s) в f. Мне выдается segmentationfault. Что я не так сделал? void f(char *s){ strcpy(s,"abc"); return; } int main(){ char s[10]; f(&s); printf("%s\n",s); } Кстати, когда я меняю char s[10] на char *s, а f(&s) на f(s), то программа мне выводит "abc", но потом всеравно пишет segmentationfault. Я знаю, что это можно реализовать создав отдельно указатель и указав им на char s[10], но мне интересно, можно ли это сделать другими (см. выше) способами

2)Можно ли передать в ф-цию в качестве аргумента битовое поле, и если можно то как? Нижележащий способ не подходит: void f(int i,int j){ ... } int main(){ struct{int i:1;int j:1}field; f(field.i,field.j); } Надо чтобы внутри самой ф-ции f поля оставались размером по одному биту, я не по int'у

3)у меня есть char s[4],*sp; sp=s; Когда я пишу strcpy(sp,"ab"); printf("%s %d\n",sp,strlen(sp)); то все хорошо, но когда я заменяю strcpy(sp,"ab"); на *(sp++)='a';*(sp++)='b';*(sp++)='\0'; то мне вместо "ab 2" выводится " 0" - почему?

anonymous

почитай что-нибудь a?

> и я передаю ее адрес (&s) в f

нужно передавать s

> то мне вместо "ab 2" выводится " 0" - почему?

потому что у тебя sp изменился

> Надо чтобы внутри самой ф-ции f поля оставались размером по одному биту, я не по int'у

зачем? В Си размер отдельного объекта всегда кратен размеру char.

dilmah ★★★★★
()

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

void f ( char *s, int size_char )
{
    const char *need_to_copy = "bla-bla";
    strncpy ( s, need_to_copy, size_char );
    return;
}

int main()
{
    char *s;
    int size_char = 10; // s[size_char]
    s = ( char * ) malloc ( size_char * sizeof ( char ) );
    f ( s, size_char );
    printf ( "%s\n", s );
    return 0;
}

+ man strncpy ; man malloc ; и buy book "C++"
Разберешься ? 

anonymous
()

Все так и есть как тебе сказали. В твоем случае s - это уже указатель (на первый элемент массива) и из него не надо брать адрес, потому что это совсем другое значение получится, и как следствие - seg fault. Короче, читай литературу. Говорят, учебник Кэрнигана и Ритчи достаточно хорош для ознакомления.

anonymous
()

По моему это стёб.
Это ж новая серия анекдотов на Це.
Как там модно щас говорить:
"афтар пиши исчо!!!"

anonymous
()
Ответ на: комментарий от anonymous

+ man strncpy ; man malloc ; и buy book "C++"

Вот нахера тут маллок, вот объясните? P.S: have 3+ years programming exp.

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