LINUX.ORG.RU

Передача структуры в функцию на Си


0

1
struct watch {
    struct in_addr ipaddress; // remote ip
    int port; //remote port
    char *pathname; //file to be watched
};
typedef struct watch watch_t;

// file change handler will be called 
// when an event happens
// with parameters: watch details and the 
// event that occurred  on that watch
typedef void (*filechangehandler_t)(watch_t, int); << -- передаем структуру

Почему этот код не дает ошибку? Ведь передается не указатель на структуру, а - структура. Разве такое разрешено в Си?

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

Маны почитать не бывает?

On error, these functions return NULL.

Если malloc не сможет выделить достаточно памяти, он вернет NULL. Т.е. проверив указатель после malloc'а можно сказать: была память выделена, или нет.

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

> Если malloc не сможет выделить достаточно памяти, он вернет NULL. Т.е. проверив указатель после malloc'а можно сказать: была память выделена, или нет.

Маны почитать не бывает?

Попробуйте прочитать ман про malloc от корки до корки.

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

И что? Всего 2 страницы на calloc, malloc, free и realloc. В секции RETURN VALUE все отлично расписано. В секции NOTES упомянуто, что «шухер» бывает при нарушении кучи и двойном free. В общем, ничего такого, говорящего, что malloc может не выделив заказанной области памяти вернуть не-NULL.

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

> Если malloc не сможет выделить достаточно памяти, он вернет NULL. Т.е. проверив указатель после malloc'а можно сказать: была память выделена, или нет.

посмотри, что вернёт malloc на просьбу выделить в два раза больше памяти, чем у тебя её есть (включая своп, конечно).

arsi ★★★★★
()
Ответ на: комментарий от Eddy_Em

> В общем, ничего такого, говорящего, что malloc может не выделив заказанной области памяти вернуть не-NULL.

Может все-таки до самого конца дочитаете?

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

> А как malloc'у больше 2ГБ передать?

А в чем собственно сложность?

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

> On error, these functions return NULL.

В том же мане в разделе BUGS читаем:

By default, Linux follows an optimistic memory allocation strategy. This means that when malloc() returns non-NULL there is __no guarantee__ that the memory really is available. This is a really bad bug.

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

Ладно, убедили :)

А как malloc'у больше 2ГБ передать?

А в чем собственно сложность?

Сложность в том, что у malloc'а по умолчанию аргумент имеет тип size_t, а эта собака 32-битная. Специально проверял - при указании size_t x = 5000000000LL на самом деле x принимает совершенно другое значение.

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

В том же мане в разделе BUGS читаем:

> By default, Linux follows an optimistic memory allocation strategy. This means that when malloc() returns non-NULL there is __no guarantee__ that the memory really is available. This is a really bad bug.


И при чём тут Linux? Линукс - это всего лишь ядро.

LamerOk ★★★★★
()
Ответ на: комментарий от Eddy_Em

> Сложность в том, что у malloc'а по умолчанию аргумент имеет тип size_t, а эта собака 32-битная.

Это от платформы зависит.

А как malloc'у больше 2ГБ передать?

В чем магичность 2Гб?

Специально проверял - при указании size_t x = 5000000000LL на самом деле x принимает совершенно другое значение.

Зачем сразу 5000000000LL? 3Гб как бы тоже больше 2Гб.

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

В чем магичность 2Гб?

В том, что это - максимальное число, которое можно передать 32-битным int'ом, коим и является size_t =)

3Гб как бы тоже больше 2Гб.

У меня 2ГБ оперативки + 2ГБ свопа. Так что, надо точно больше 4ГБ.

И да, система, как сами понимаете, 32-битная (вот куплю еще гигов 6 оперативки, поставлю 64-битную).

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

> больше 2ГБ

Сложность в том, что у malloc'а по умолчанию аргумент имеет тип size_t, а эта собака 32-битная.

«size_t is an unsigned data type»

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

Точно, sorry.

Ладно. Вот пример: пытаюсь выделить 4ГБ оперативки:

19:28 /dev/shm
cat 1.c 
#include <stdlib.h>
#include <stdio.h>
main(){
	size_t s = 4000000000UL;
	printf("sizeof s = %d, s = %lu\n", sizeof(s), s);
	char *ptr = malloc(s);
	if(ptr) printf("OK\n");
	else printf("NO\n");
}
19:27 /dev/shm
cat > 2.c
#include <stdlib.h>
#include <stdio.h>
main(){
	size_t s = 4000000000UL;
	printf("sizeof s = %d, s = %lu\n", sizeof(s), s);
	char *ptr = malloc(s);
	if(ptr) printf("OK\n");
	else printf("NO\n");
}
19:29 /dev/shm
gcc 2.c 
19:29 /dev/shm
./a.out 
sizeof s = 4, s = 4000000000
NO
Так что, матюгается...

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

>У меня 2ГБ оперативки + 2ГБ свопа. Так что, надо точно больше 4ГБ.
Ты не можешь заюзать >3Гб в программе (во всей, не только в этом malloc). Потому, что

32-битная


(вот куплю еще гигов 6 оперативки, поставлю 64-битную).

У меня и на одном гиге была 64-битная. Вполне сносно.

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

Ты не можешь заюзать >3Гб в программе (во всей, не только в этом malloc). Потому, что

32-битная

Не знал, в своих программулинках ни разу не пытался больше 2ГБ выделить.

А 64-битную пока рановато устанавливать - моя мандрива 2009 (с обновлениями) еще не настолько устарела.

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

> пытаюсь выделить 4ГБ оперативки

ты <оскорбительное слово>? на 32-битном линухе по дефолту стоит распределение памяти 3Г/1Г, т.е. три гига адресного пространства на юзерспейс и 1 гиг — на кернелспейс. это распределение можно изменить, но только в сторону уменьшения доступного в юзерспейсе адресного пространства: 2Г/2Г или 1Г/3Г. а теперь расскажи, чем ты думал, когда пытался выделить 4 гига?

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