얼마나 많은 별표를 넣을 수 있습니까?
*
)는 포인터 변수를 선언하거나 역참조하는 데 사용됩니다.그런데 함수 호출 앞에 별표를 원하는 만큼 붙일 수 있다는 사실을 알고 계셨나요?
다음은 간단하고 유효한 C 프로그램입니다.
#include <stdio.h>
int main(){
printf("Hello world!\n");
}
유효한 C 프로그램도 있습니다.
#include <stdio.h>
int main(){
(*printf)("Hello world!\n");
}
여기에도 유효한 것이 있습니다.
#include <stdio.h>
int main(){
(******printf)("Hello world!\n");
}
100개의 별표가 있는 이 프로그램도 완벽한 C 프로그램입니다.
#include <stdio.h>
int main(){
(
**********
**********
**********
**********
**********
**********
**********
**********
**********
**********
printf)("Hello world!\n");
}
이것을 보고 얼마나 많은 별표를 추가할 수 있는지 궁금하십니까? 알아 보자.
이것은 지정된 수의 별표를 printf 함수 앞에 추가하는 Ruby 스크립트입니다.
def check(n)
s = "*"*n
open("test.c","w") do |f|
f.puts <<EOS
#include <stdio.h>
int main(){
(#{s}printf)("Hello World!\\n");
}
EOS
end
return system("clang test.c")
end
check(ARGV[0].to_i)
이렇게 사용할 수 있습니다.
ruby check.rb 10
다음 소스 코드를 생성합니다.
#include <stdio.h>
int main(){
(**********printf)("Hello World!\n");
}
천 개의 별표로 시도해 봅시다.
ruby check.rb 1000
문제 없어요. 그런 다음 만 시도하십시오.
ruby check.rb 10000
PLEASE submit a bug report to https://bugs.llvm.org/ and include the crash backtrace, preprocessed source, and associated run script.
Stack dump:
(snip)
clang-12: error: unable to execute command: Segmentation fault (core dumped)
clang-12: error: clang frontend command failed due to signal (use -v to see invocation)
Clang은 SIGSEGV로 사망했습니다.
Clang은 1000개의 별표로 괜찮았고 10,000개의 별표로 사망했습니다. 그래서 어딘가에 한계가 있을 것입니다. 이진 검색으로 확인해 봅시다.
def check(n)
s = "*"*n
open("test.c","w") do |f|
f.puts <<EOS
#include <stdio.h>
int main(){
(#{s}printf)("Hello World!\\n");
}
EOS
end
if system("clang test.c 2> /dev/null")
puts "#{n} OK"
false
else
puts "#{n} NG"
true
end
end
(1000..10000).bsearch do |n|
check(n)
end
다음은 실행 결과입니다.
$ ruby search.rb
5500 NG
3250 NG
2125 NG
1562 OK
1844 NG
1703 NG
1633 OK
1668 NG
1651 OK
1660 NG
1656 OK
1658 NG
1657 OK
이제 우리는 새로운 지식을 얻었습니다. 최대 1657개의 별표를 넣을 수 있습니다(환경에 따라 다름).
그건 그렇고, GCC로 시도해 봅시다. 다음은 확인 스크립트입니다.
def check(n)
s = "*"*n
open("test.c","w") do |f|
f.puts <<EOS
#include <stdio.h>
int main(){
(#{s}printf)("Hello World!\\n");
}
EOS
end
return system("gcc test.c")
end
check(ARGV[0].to_i)
1000부터 해보자.
ruby check_gcc.rb 1000
문제 없어요. 다음은 10,000입니다.
ruby check_gcc.rb 10000
음, 100,000은 어떻습니까?
ruby check_gcc.rb 100000
진지하게? 그럼 1,000,000.
$ ruby check_gcc.rb 1000000
gcc: internal compiler error: Segmentation fault signal terminated program cc1
Please submit a full bug report,
with preprocessed source if appropriate.
See <http://bugzilla.redhat.com/bugzilla> for instructions.
이런, gcc는 백만 개의 별표를 사용했습니다.
따라서 만 개의 별표를 사용하려면 GCC를 사용하십시오.
Reference
이 문제에 관하여(얼마나 많은 별표를 넣을 수 있습니까?), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/kaityo256/how-many-asterisks-can-be-put-o71텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)