sizeof ってスタック領域でのサイズだったのか!
#include <glib.h>
#include <stdio.h>
int
main (int argc, char *argv[]) {
gchar* s;
/* コレはイケる */
gchar c[] = "たのしい Linux 1";
g_printf ("%s は %ld 文字です\n", c, g_utf8_strlen(c, sizeof(c)));
/* sizeof(s) が 8byte、つまりポインタのサイズになってしまう */
s = g_strdup("たのしい Linux 2");
g_printf ("%s は %ld 文字です\n", s, g_utf8_strlen(s, sizeof(s)));
g_free(s);
/* 一応試したけど同じだった */
s = g_malloc(256);
g_sprintf(s, "たのしい Linux 3");
g_printf ("%s は %ld 文字です\n", s, g_utf8_strlen(s, sizeof((gchar*)s)));
g_free(s);
/* strlen ならイケるけど警告になる */
s = g_strdup("たのしい Linux 4");
g_printf ("%s は %ld 文字です\n", s, g_utf8_strlen(s, strlen(s)));
g_free(s);
/* Best */
s = g_strdup("たのしい Linux 5");
g_printf ("%s は %ld 文字です\n", s, g_utf8_strlen(s, -1));
g_free(s);
return 0;
}
gcc でしか試していないけど、まあ思いっきり GLib だし。
(gchar*) キャストも無意味ってことはつまりそういうことだろう。
ひらがな UTF-8 は 3byte だから当然 2 文字分しか検出しない結果に。
検索しても何も見つからないのは何故だろう?
gcc 以外ならイケるのか、それとも皆スタック領域でしか sizeof を使わないのか。
てゆーかこの問題は -1 指定で普通に解決した。
おかげでこんなことが解ったので無駄な時間は結果オーライ。
