int main(int argc, char *argv[]) {
char *str = "Xi You Linux Group 20";
printf("%d\n", printf(str));
return 0;
}
解读:
c
#include <stdio.h>
int main(int argc, char *argv[]) {
char *str = "Xi You Linux Group 20";
printf("%d\n", printf(str));
// printf(str) returns the length of the string, 21
// So the result is "Xi You Linux Group 2021"
return 0;
}
int i = 2;
void func() {
if(i != 0) {
static int m = 0;
int n = 0;
n++;
m++;
printf("m = %d, n = %d\n", m, n);
i--;
func();
} else {
return;
}
}
int main(int argc, char *argv[]) {
func();
return 0;
}
解读:
c
#include <stdio.h>
int i = 2;
void func() {
if(i != 0) {
static int m = 0;
int n = 0;
n++;
m++;
// m = 1, n = 1
printf("m = %d, n = %d\n", m, n);
i--;
func();
// loop once, then m = 2, n = 1, i = 0 and exit loop
} else {
return;
}
}
int main(int argc, char *argv[]) {
func();
return 0;
}
int* get_array() {
int array[1121];
for (int i = 0; i < sizeof(array) / sizeof(int); i++) {
array[i] = i;
}
return array;
}
int main(int argc, char *argv[]) {
int *p = get_array();
}
解读:
c
#include <stdio.h>
int* get_array() {
int array[1121];
for (int i = 0; i < sizeof(array) / sizeof(int); i++) {
array[i] = i;
}
// How dare you return this!?
return array;
}
int main(int argc, char *argv[]) {
// get_array() returns the unusable address of a local variable,
// the content of whom was discarded, but you can declare
// a static variable in get_array() and return it to avoid so
int *p = get_array();
}
#include <stdio.h>
int main(int argc, char *argv[]) {
char str[] = "XiyouLinuxGroup";
char *p = str;
char x[] = "XiyouLinuxGroup\t\106F\bamily";
// XiyouLinuxGroup Family
// sizeof(str) = 16, containing '\0' at the end
// sizeof(p) = 8, 'cuz p is a char pointer,
// only storing the address of variable str
// sizeof(x) = 24, containing '\0' at the end
// strlen(x) = 24, 'cuz of '\b', 'F' is covered by 'a'
printf("%zu %zu %zu %zu\n", sizeof(str), sizeof(p),
sizeof(x), strlen(x));
return 0;
}
int add(int *x, int y) {
return *x = (*x^y) + ((*x&y)<<1);
}
int a;
int main(int argc, char *argv[]) {
int b = 2020;
if(add(&b, 1) || add(&a, 1)) {
printf("XiyouLinuxGroup%d\n", b);
printf("Waiting for y%du!\n", a);
}
if(add(&b, 1) && a++) {
printf("XiyouLinuxGroup%d\n", b);
printf("Waiting for y%du!\n", a);
}
return 0;
}
解读:
c
#include <stdio.h>
int add(int *x, int y) {
return *x = (*x^y) + ((*x&y)<<1);
}
int a;
int main(int argc, char *argv[]) {
int b = 2020;
// add(&b, 1) returns true, so add(&a, 1) is not executed
if(add(&b, 1) || add(&a, 1)) {
printf("XiyouLinuxGroup%d\n", b);
printf("Waiting for y%du!\n", a);
}
// add(&b, 1) returns true, while a++ executed with ruturning 0,
// so this conditional statement will not be executed
if(add(&b, 1) && a++) {
printf("XiyouLinuxGroup%d\n", b);
printf("Waiting for y%du!\n", a);
}
return 0;
}
void func() {
int a = 2020;
unsigned long c;
printf("%p\n", &a);
printf("我们想要修改的地址:");
scanf("%lx", &c);
printf("请随便输入一个数字:");
scanf("%d", (int *)c);
printf("a = %d\n", a);
}
解读:
c
// It's totally about the basic concept of pointers
#include <stdio.h>
void func() {
int a = 2020;
unsigned long c;
// We get the address of variable a
printf("%p\n", &a);
printf("我们想要修改的地址:");
// We want to modify the value on address entered
scanf("%lx", &c);
printf("请随便输入一个数字:");
// And then we modified it. All done.
scanf("%d", (int *)c);
printf("a = %d\n", a);
}
#include <stdio.h>
int main() {
// It outputs a anoymous int array as a char array
// using little-endian storing methods
puts((char *)(int const[]){
// o y i X n i L u r G x u
0X6F796958, 0X6E694C75, 0X72477875,
// 2 p u o (\0)2 1 0
0X3270756F, 0X313230, 0X00000A});
}
评论区
评论加载中...