Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.216.110.157] |
|
Сообщ.
#1
,
|
|
|
Подскажите, что за ботва. Хочу массив структур в памяти, создавать и менять данные в переменных.
Приведенный пример, по идее, должен заполнять тестовый шаблон 5-ю элементами. Затем найти элемент с индексом 2 (счёт от 0) и вернуть указатель на структуру (если найдено совпадение по содержимому поля client_ip). Почему-то возвращаемый указатель больше базового на 800 байт, хотя должен (20 байт/структуру * 2 индекс=) 40 байт. В чём я не прав и как исправить процедуру find_ip() чтобы она возвращала правильный указатель? // gcc pointers.c -o pointers #include <stdlib.h> // #include <malloc.h> struct client_ip_traffic_sum { unsigned long client_ip; unsigned long traffic_all_low; unsigned long traffic_all_high; unsigned long traffic_cached_low; unsigned long traffic_cached_high; }; int client_ips, i; struct client_ip_traffic_sum * pointer; void * void_ptr; unsigned long ip; struct client_ip_traffic_sum * select_client; struct client_ip_traffic_sum * find_ip(void) { struct client_ip_traffic_sum * selected_client, *ipa; pointer=void_ptr; selected_client=pointer; printf("selected_client before=\t%u\n",selected_client); if (client_ips!=0) { i=0; // ip=pointer[i].client_ip; ip=pointer->client_ip; ip_searching: if (ip==pointer[i].client_ip) {goto ip_searched;} else {if (i<client_ips) {i++; goto ip_searching;} else {goto ip_not_searched;}} } ip_not_searched: selected_client=NULL; return selected_client; ip_searched: //printf("Current:%u\tIndex:%u\tSize:%u\n",selected_client,i,sizeof(struct client_ip_traffic_sum)); ipa = selected_client; printf("selected_client after=\t%u\n",selected_client); selected_client=selected_client+(sizeof(struct client_ip_traffic_sum)*i); //printf("Previous:%u\tSelected:%u\tDifferense:%u\n",ipa,selected_client,selected_client-ipa); printf("selected_client=\t%u\n",selected_client); return selected_client; } int main() { void_ptr = malloc(sizeof(struct client_ip_traffic_sum)*1024); if (!void_ptr) {printf("Could not allocate memory!\n"); exit(1);} printf("Void_ptr=%u\n",void_ptr); pointer=void_ptr; ip=1; client_ips=5; //=0; for (i=0; i<client_ips; i++){pointer[i].client_ip=ip; ip++;} ip=3; select_client=find_ip(); //if (select_client!=NULL) {printf("Select_client=%u\tip=%u\n",select_client,select_client->client_ip);} else {printf("F*ck\n");} //printf("Start:%u\tCurrent:%u\n",void_ptr,select_client); //printf("S:%u\tC:%u\tD:%u\n",void_ptr,select_client,select_client-void_ptr); free(void_ptr); //printf("Size:%u\n",sizeof(struct client_ip_traffic_sum)); } |
Сообщ.
#2
,
|
|
|
ip_searched: //printf("Current:%u\tIndex:%u\tSize:%u\n",selected_client,i,sizeof(struct client_ip_traffic_sum)); ipa = selected_client; printf("selected_client after=\t%u\n",selected_client); selected_client=selected_client+i; //(sizeof(struct client_ip_traffic_sum)*i); т.к. struct client_ip_traffic_sum * select_client; |