Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: не возвращает по указателю
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
sergey sva
Почему может быть так, где что посмотреть?
в одной функции выделяется память после вызывается другая функция она должна по указателю записать массив символов но возвращает абракадабру .
Код
void fun2(){

char *duf = malloc(1000);

duf ="ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff";

fun1(duf); //эта функция не возвращает   "1111111111122222233333333";


write ("запись старт"); //это работает

write (duf);

write ("запись енд"); //это работает

free(duf);
}


void fun1(char * buf){

buf = "1111111111122222233333333";

}

aaarrr
Цитата(sergey sva @ Mar 29 2011, 19:44) *
она должна по указателю записать массив символов но возвращает абракадабру .

Она не пишет массив по указателю, а просто меняет значение указателя и ничего не возвращает. Впрочем, сам указатель был испорчен еще в fun2().
sergey sva
Цитата
Впрочем, сам указатель был испорчен еще в fun2().

Где ?
aaarrr
Да вот здесь:
Код
duf ="ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff";
sergey sva
он будет указывать на последний элемент? думал что должен указывать на первый.
Methane
void fun1(char * buf){
static unsigned char l_buf[] = "1111111111122222233333333";
memcpy(buf,l_buf,sizeof(l_buf));
}
aaarrr
Нет, он будет содержать совсем не то значение, которое было присвоено строкой:
Код
char *duf = malloc(1000);


Своими действиями вы меняете сам указатель, а не то, на что он указывает.
Methane
Цитата(sergey sva @ Mar 29 2011, 17:44) *
Почему может быть так, где что посмотреть?
в одной функции выделяется память после вызывается другая функция она должна по указателю записать массив символов но возвращает абракадабру .
Код
void fun2(){

char *duf = malloc(1000);
// Создали переменную duf, и содержащую адресс в памяти, где есть место на 1000 байт.

duf ="ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff";
// выделили в стеке память для "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff";, и потеряли указатель на те 1000 байт. Тоесть уже утечка памяти случилась, вы те 1000 байт уже не сможете освободить.
fun1(duf); //эта функция не возвращает   "1111111111122222233333333";


write ("запись старт"); //это работает

write (duf);

write ("запись енд"); //это работает

free(duf);
}


void fun1(char * buf){

buf = "1111111111122222233333333";
// тут вы в стеке выделили память для "1111111111122222233333333", записали его адресс в buf,  память для "1111111111122222233333333" освободили, и вышли. Теперь duf указывает в никуда.
}

aaarrr
Цитата
Теперь duf указывает в никуда

С duf как раз ничего не случится.
sergey sva
Понял свою ошибку, сделал через memcpy все работает.
Methane
Цитата(aaarrr @ Mar 29 2011, 18:12) *
С duf как раз ничего не случится.

Каюсь. Тормознул.

А что автору-то надо?

Цитата(sergey sva @ Mar 29 2011, 18:29) *
Понял свою ошибку, сделал через memcpy все работает.

Еще так можно
Код
void fun1(char ** buf){
    static unsigned char l_buf[] = "1111111111122222233333333";
    *buf = l_buf;
}

int main(void)
{
       char *duf;
    fun1(&duf);
    printf("after %p\n",duf);
    puts(duf);

}
GetSmart
Цитата(Methane @ Mar 29 2011, 21:34) *
Каюсь. Тормознул.

А что автору-то надо?

К155ЛА3 biggrin.gif biggrin.gif biggrin.gif
Methane
Цитата(GetSmart @ Mar 29 2011, 18:34) *
К155ЛА3 biggrin.gif biggrin.gif biggrin.gif

К155ЛА3 не цель, а средство!
GetSmart
Цитата(Methane @ Mar 29 2011, 21:41) *
К155ЛА3 не цель, а средство!

Универсальное, на все случаи.
Methane
Цитата(GetSmart @ Mar 29 2011, 18:50) *
Универсальное, на все случаи.

Ну, когда-то схему цветомузыки на К155ЛА8 видел.
sergey sva
Есть разница в выделение памяти ?
так
char buf[100];
и так
char *buf = mallocC(100);
aaarrr
Есть, конечно. В первом случае память будет выделена статически или на стеке, а во втором из кучи.
sergey sva
Понятно.
Methane
Цитата(sergey sva @ Mar 31 2011, 16:58) *
Понятно.

Интересно что? Те кто знает что такое стек и что такое куча, таких вопросов не задают.
sergeeff
Цитата(Methane @ Mar 31 2011, 19:28) *
Интересно что? Те кто знает что такое стек и что такое куча, таких вопросов не задают.


Ну а что же делать с теми, кто такие вопросы задают? Обучать. Не расстреливать же, право.
Methane
Цитата(sergeeff @ Mar 31 2011, 17:43) *
Ну а что же делать с теми, кто такие вопросы задают? Обучать. Не расстреливать же, право.

Стрелять когда говорят что понятно.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.