stackprobe7s_memo

何処にも披露する見込みの無いものを書き落とす場所

ポインタ

C言語のポインタってこんなことできるんだよという大人気ないこのコードを披露する機会は一生やってこないと思ったのでここに残しておく。
ちなみに、後から気づいたのだが ANSI C, Cxx などの規格的にやってはいけないことをやっている。
少なくとも 2_code, 2B_code で禁忌を侵している。(インクリメント・デクリメントした変数を同じ式内でポインタを介して再参照してはならなかったはず)
他にも何かを踏み抜いているかもしれない。
以上 2022/8/25 に追記


1_code

#include <stdio.h>

main()
{
	void *a[2];
	void ****************************************************************************************************************************p;
	void *que;

	p = (void *)a;

	a[1] = p;

	que = p[1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1]
		[1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1]
		[1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1]
		[1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1];

	printf("%p\n%p\n%p\n%p\n", a, a[1], p, que);
}

1_output

004FF860
004FF860
004FF860
004FF860

 
 
2_code

#include <stdio.h>

main()
{
	void *a[2];
	void ****p;

	p = (void *)a;

	a[0] = p;
	a[1] = p;

	++*++*p++; --*--*p--;
	++*++*p++; --*--*p--;
	++*++*p++; --*--*p--;
	++*++*p++; --*--*p--;

	printf("%p\n%p\n%p\n%p\n", a, a[0], a[1], p);
}

2_output

00D3F814
00D3F814
00D3F814
00D3F814

 
 
2B_code
https://paiza.io/projects/mRjXl_AEsvaXmI0imKoLWw (paiza.IO)

#include <stdio.h>

main()
{
	void *a[2];
	void ********************************************************************************************************************************
         ********************************************************************************************************************************p;
	void *q;

	p = (void *)a;

	a[0] = p;
	a[1] = p;

	q = *++*++*--*--*++*++*--*--*++*++*--*--*++*++*--*--*++*++*--*--*++*++*--*--*++*++*--*--*++*++*--*--
		*++*++*--*--*++*++*--*--*++*++*--*--*++*++*--*--*++*++*--*--*++*++*--*--*++*++*--*--*++*++*--*--
		*++*++*--*--*++*++*--*--*++*++*--*--*++*++*--*--*++*++*--*--*++*++*--*--*++*++*--*--*++*++*--*--
		*++*++*--*--*++*++*--*--*++*++*--*--*++*++*--*--*++*++*--*--*++*++*--*--*++*++*--*--*++*++*--*--
		*++*++*--*--*++*++*--*--*++*++*--*--*++*++*--*--*++*++*--*--*++*++*--*--*++*++*--*--*++*++*--*--
		*++*++*--*--*++*++*--*--*++*++*--*--*++*++*--*--*++*++*--*--*++*++*--*--*++*++*--*--*++*++*--*--
		*++*++*--*--*++*++*--*--*++*++*--*--*++*++*--*--*++*++*--*--*++*++*--*--*++*++*--*--*++*++*--*--
		*++*++*--*--*++*++*--*--*++*++*--*--*++*++*--*--*++*++*--*--*++*++*--*--*++*++*--*--*++*++*p++;

	printf("%p\n%p\n%p\n%p\n%p\n", a + 1, a[0], a[1], p, q);
}

2B_output

0x7ffc6fd1fe88
0x7ffc6fd1fe88
0x7ffc6fd1fe88
0x7ffc6fd1fe88
0x7ffc6fd1fe88

 
 
3_code

#include <stdio.h>

static void *f()
{
	return f;
}
main()
{
	void *(*(*(*(*(*(*(*(*(*(
         *(*(*(*(*(*(*(*(*(*(
         *(*(*(*(*(*(*(*(*(*(
         *(*(*(*(*(*(*(*(*(*(
         *(*(*(*(*(*(*(*(*(*(*p)())())())())())())())())())()
                               )())())())())())())())())())()
                               )())())())())())())())())())()
                               )())())())())())())())())())()
                               )())())())())())())())())())();
	void *q;

	p = (void *)f;

	q = p()()()()()()()()()()
         ()()()()()()()()()()
         ()()()()()()()()()()
         ()()()()()()()()()()
         ()()()()()()()()()();

	printf("%p\n%p\n%p\n", f, p, q);
}

3_output

00C21000
00C21000
00C21000