やっぱ、企業ってお金稼ぐことも大切ですが、雇用の安定とか社会的な責任を果たすことも大事ですからね。
わかりやすくするためにコードを簡単にするとこんな感じ。
#include <stdio.h>
void func(int* a){
*a=12345;
}
int main(int argc,char* argv[])
{
int a;
func((int*)a);
printf("a=%d\n",(int)a);
return 0;
}
うーん、これはとっても難しい問題だね。
なのでどうすれば動くのか一緒に考えてみました。
案その1:
グローバルなint*をオペレーターを定義できないかなぁ
operator int*(int a){
return &a;
}
文法上キャストのグローバルオペレータは定義できなかった気が・・・。
案その2:
変数aに自分自身のアドレスを入れる。
void func(int* a){
*a=12345;
}
int main(int argc,char* argv[])
{
int a=(int)&a;
func((int*)a);
printf("a=%d\n",(int)a);
return 0;
}
一応androidだと動くけれど、iphone5Sとiphone6だとたぶん動かない。
案その3:
変数aをintptr_tにする。
void func(int* a){
*a=12345;
}
int main(int argc,char* argv[])
*a=12345;
}
int main(int argc,char* argv[])
{
intptr_t a=(intptr_t)&a;
func((int*)a);
printf("a=%d\n",(int)a);
return 0;
}
これで大体どんな環境でも動くじゃん。
64ビットのBIGエンディアンとかは動かない気もする。
ということはstrict aliasingルールに反する気も。
やっぱ、どうしてもあそこに&をつけたいけれど、女性とあの行だけは決して手をだしていけない。&をつけてはいけないにルール変更。
案その4:
ということはstrict aliasingルールに反する気も。
やっぱ、どうしてもあそこに&をつけたいけれど、女性とあの行だけは決して手をだしていけない。&をつけてはいけないにルール変更。
案その4:
void func(intptr_t* a){
*a=12345;
}
*a=12345;
}
int main(int argc,char* argv[])
{
intptr_t a=(intptr_t)&a;
func((intptr_t*)a);
printf("a=%d\n",(int)a);
return 0;
}
やったーやっとこれできちんと動く。
やっぱり、どんな環境でもきちんと動くってとっても難しいです。
0 件のコメント:
コメントを投稿