реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> не возвращает по указателю
sergey sva
сообщение Mar 29 2011, 15:44
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923



Почему может быть так, где что посмотреть?
в одной функции выделяется память после вызывается другая функция она должна по указателю записать массив символов но возвращает абракадабру .
Код
void fun2(){

char *duf = malloc(1000);

duf ="ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff";

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


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

write (duf);

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

free(duf);
}


void fun1(char * buf){

buf = "1111111111122222233333333";

}

Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 29 2011, 15:48
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



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

Она не пишет массив по указателю, а просто меняет значение указателя и ничего не возвращает. Впрочем, сам указатель был испорчен еще в fun2().
Go to the top of the page
 
+Quote Post
sergey sva
сообщение Mar 29 2011, 15:53
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923



Цитата
Впрочем, сам указатель был испорчен еще в fun2().

Где ?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 29 2011, 15:54
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Да вот здесь:
Код
duf ="ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff";
Go to the top of the page
 
+Quote Post
sergey sva
сообщение Mar 29 2011, 15:56
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923



он будет указывать на последний элемент? думал что должен указывать на первый.
Go to the top of the page
 
+Quote Post
Methane
сообщение Mar 29 2011, 15:58
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 3 615
Регистрация: 12-01-09
Из: США, Главное разведовательное управление
Пользователь №: 43 230



void fun1(char * buf){
static unsigned char l_buf[] = "1111111111122222233333333";
memcpy(buf,l_buf,sizeof(l_buf));
}
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 29 2011, 15:59
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Нет, он будет содержать совсем не то значение, которое было присвоено строкой:
Код
char *duf = malloc(1000);


Своими действиями вы меняете сам указатель, а не то, на что он указывает.
Go to the top of the page
 
+Quote Post
Methane
сообщение Mar 29 2011, 16:08
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 3 615
Регистрация: 12-01-09
Из: США, Главное разведовательное управление
Пользователь №: 43 230



Цитата(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 указывает в никуда.
}

Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 29 2011, 16:12
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



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

С duf как раз ничего не случится.
Go to the top of the page
 
+Quote Post
sergey sva
сообщение Mar 29 2011, 16:29
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923



Понял свою ошибку, сделал через memcpy все работает.
Go to the top of the page
 
+Quote Post
Methane
сообщение Mar 29 2011, 16:34
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 3 615
Регистрация: 12-01-09
Из: США, Главное разведовательное управление
Пользователь №: 43 230



Цитата(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);

}
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Mar 29 2011, 16:34
Сообщение #12


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



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

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

К155ЛА3 biggrin.gif biggrin.gif biggrin.gif

Сообщение отредактировал GetSmart - Mar 29 2011, 17:06


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
Methane
сообщение Mar 29 2011, 16:41
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 3 615
Регистрация: 12-01-09
Из: США, Главное разведовательное управление
Пользователь №: 43 230



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

К155ЛА3 не цель, а средство!
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Mar 29 2011, 16:50
Сообщение #14


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



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

Универсальное, на все случаи.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
Methane
сообщение Mar 29 2011, 16:55
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 3 615
Регистрация: 12-01-09
Из: США, Главное разведовательное управление
Пользователь №: 43 230



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

Ну, когда-то схему цветомузыки на К155ЛА8 видел.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 01:46
Рейтинг@Mail.ru


Страница сгенерированна за 0.01621 секунд с 7
ELECTRONIX ©2004-2016