*static void hex2dec(const char *str, unsigned long *x) { short i = 0; short n; char c; *x = 0; while (*(str+i) != '\0') { if ('0' <= *(str+i) && *(str+i) <= '9') n = *(str+i) - '0'; else if ('a' <= (c = tolower(*(str+i))) && c <= 'f') n = c - 'a' + 10; else exit(0); i++; *x = *x * 16 + n; } return; }
static void dec2rgb(const unsigned long dec, int *rgb) { rgb[0] = (dec >> 16); rgb[1] = (dec >> 8) & 0xff; rgb[2] = dec & 0xff; }
#include <stdio.h> #include <stdlib.h> #include <strings.h> #define MAX_MEMBERS 10 typedef struct member_t { char *name; int age; } member_t; int main() { member_t **members; member_t **p; int i; members = malloc(sizeof(member_t *) * MAX_MEMBERS); p = members; for (i = 0; i < MAX_MEMBERS; i++) { *p = malloc(sizeof(member_t *)); (*p)->name = malloc(sizeof(char *)); sprintf((*p)->name, "hoge%d", i); (*p)->age = i; p++; } for (i = 0; i < MAX_MEMBERS; i++) { printf("%s %d\n", (*members)->name, (*members)->age); members++; } return 0; }
「**p」を用意する理由は、forで回すときにmembers++をしてしまうとmembersの最初のアドレスがどこかわからなくなってしまうから。なので、下記のように書いてpに一旦membersの先頭アドレスを取っておいてmemberesに戻すという方法も使える。
#include <stdio.h> #include <stdlib.h> #include <strings.h> #define MAX_MEMBERS 10 typedef struct member_t { char *name; int age; } member_t; int main() { member_t **members; member_t **p; int i; members = malloc(sizeof(member_t *) * MAX_MEMBERS); p = members; for (i = 0; i < MAX_MEMBERS; i++) { *members = malloc(sizeof(member_t *)); (*members)->name = malloc(sizeof(char *)); sprintf((*members)->name, "hoge%d", i); (*members)->age = i; members++; } members = p; for (i = 0; i < MAX_MEMBERS; i++) { printf("%s %d\n", (*members)->name, (*members)->age); members++; } return 0; }
コメントをかく