異なる要素数のポインタ配列キャストのWarningを消したい
やりたいこと
read()等で読み込んだ入力バッファに対し、ポインタキャストを駆使してメモリ効率の良いコーディングを行いたい。
知りたいこと
下記のコードをgcc 5.3/clang 3.7にてコンパイルするとwarningが出力されますが、言語仕様として「正しい」記述を行い、warningを消したく思っております。
表現として合っているかも自信がないのですが、表題の通り異なる要素数のポインタ配列キャストがそもそも推薦されていない、ポインタ配列キャストは問題ないがC99等規格から見ると記述が間違っている等々、ツッコミビリティが高い/低いに関わらず、気になった所をご指摘いただきたく思います。
また、C言語の勉強中の身でもありますので、ISO/IEC 9899:1999やJIS X 3010:2003等の公式規格のどの部分を参照すれば良いのか(該当箇所なのか)教えていただけると非常に嬉しく思います。
よろしくお願いいたします。
サンプルコード
#include <stdio.h>
int main(int argc, char const* argv[]) {
unsigned char ary1[64] = {"Hello World!"};
unsigned char(*ary2)[16] = {0};
// warning: incompatible pointer types assigning...
ary2 = &ary1;
printf("%s\n", *ary2);
return 0;
}
2016/02/07 23:23編集
実行環境等の記載を忘れていました。申し訳ありません。
% lsb_release -a
LSB Version: 1.4
Distributor ID: Arch
Description: Arch Linux
Release: rolling
Codename: n/a
% clang -v
clang version 3.7.1 (tags/RELEASE_371/final)
Target: x86_64-unknown-linux-gnu
Thread model: posix
Found candidate GCC installation: /usr/lib/gcc/x86_64-unknown-linux-gnu/5.3.0
Found candidate GCC installation: /usr/lib64/gcc/x86_64-unknown-linux-gnu/5.3.0
Found candidate GCC installation: /usr/sbin/../lib/gcc/x86_64-unknown-linux-gnu/5.3.0
Found candidate GCC installation: /usr/sbin/../lib64/gcc/x86_64-unknown-linux-gnu/5.3.0
Selected GCC installation: /usr/sbin/../lib64/gcc/x86_64-unknown-linux-gnu/5.3.0
Candidate multilib: .;@m64
Selected multilib: .;@m64
% clang -std=c11 -Wall -Wextra test.c
test.c:7:8: warning: incompatible pointer types assigning to 'unsigned char (*)[16]' from 'unsigned char (*)[64]' [-Wincompatible-pointer-types]
ary2 = &ary1;
^ ~~~~~
test.c:3:14: warning: unused parameter 'argc' [-Wunused-parameter]
int main(int argc, char const* argv[]) {
^
test.c:3:32: warning: unused parameter 'argv' [-Wunused-parameter]
int main(int argc, char const* argv[]) {
^
3 warnings generated.