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 指定で普通に解決した。
おかげでこんなことが解ったので無駄な時間は結果オーライ。