[root@db-172-16-3-33 zzz]# cat b.c#include <stdio.h>int main() {char * a = "hello";fprintf(stdout, "&a:%p, a:%p, a:%s\n", &a, a, a);return 0;}结果 :[root@db-172-16-3-33 zzz]# gcc -O3 -Wall -Wextra -Werror -g ./b.c -o b && ./b&a:0x7fff71b22230, a:0x400618, a:hello
0x400618 : 0x68 (ascii : h)0x400619 : 0x65 (ascii : e)0x40061a : 0x6c (ascii : l)0x40061b : 0x6c (ascii : l)0x40061c : 0x6f (ascii : o)0x40061d : 0x68 (ascii : NULL)
[root@db-172-16-3-33 zzz]# cat b.c#include <stdio.h>int main() {char * a = "hello";fprintf(stdout, "&a:%p, a:%p, a:%s\n", &a, a, a);fprintf(stdout, "sizeof(char *):%lu, sizeof(char):%lu\n", sizeof(char *), sizeof(char));fprintf(stdout, "a+0:%p, *(a+0):%x, *(a+0):%c\n", a+0, *(a+0), *(a+0));fprintf(stdout, "a+1:%p, *(a+1):%x, *(a+1):%c\n", a+1, *(a+1), *(a+1));fprintf(stdout, "a+2:%p, *(a+2):%x, *(a+2):%c\n", a+2, *(a+2), *(a+2));fprintf(stdout, "a+3:%p, *(a+3):%x, *(a+3):%c\n", a+3, *(a+3), *(a+3));fprintf(stdout, "a+4:%p, *(a+4):%x, *(a+4):%c\n", a+4, *(a+4), *(a+4));fprintf(stdout, "a+5:%p, *(a+5):%x, *(a+5):%c\n", a+5, *(a+5), *(a+5));return 0;}结果 :[root@db-172-16-3-33 zzz]# gcc -O3 -Wall -Wextra -Werror -g ./b.c -o b && ./b&a:0x7ffffe249680, a:0x4006f8, a:hellosizeof(char *):8, sizeof(char):1a+0:0x4006f8, *(a+0):68, *(a+0):ha+1:0x4006f9, *(a+1):65, *(a+1):ea+2:0x4006fa, *(a+2):6c, *(a+2):la+3:0x4006fb, *(a+3):6c, *(a+3):la+4:0x4006fc, *(a+4):6f, *(a+4):oa+5:0x4006fd, *(a+5):0, *(a+5):
[root@db-172-16-3-33 zzz]# cat b.c#include <stdio.h>int main() {char * a = "hello";char ** b = &a;fprintf(stdout, "sizeof(a):%lu, b:%p, &a:%p, b+1:%p\n", sizeof(a), b, &a, b+1);return 0;}结果 :[root@db-172-16-3-33 zzz]# gcc -O3 -Wall -Wextra -Werror -g ./b.c -o b && ./bsizeof(a):8, b:0x7fff3692b520, &a:0x7fff3692b520, b+1:0x7fff3692b528
[root@db-172-16-3-33 zzz]# cat b.c#include <stdio.h>int main() {char * a = "hello";char ** b = &a;unsigned short i;unsigned short x = (unsigned short) sizeof(a);fprintf(stdout, "&a:%p, a:%p\n", &a, a);for(i=0; i<x; i++) {fprintf(stdout, "i:%u, ((char *) b)+i:%p, *(((char *) b)+i):%x\n", i, ((char *) b)+i, *(((char *) b)+i));}return 0;}结果 :[root@db-172-16-3-33 zzz]# gcc -O3 -Wall -Wextra -Werror -g ./b.c -o b && ./b&a:0x7fff1ffff608, a:0x400728i:0, ((char *) b)+i:0x7fff1ffff608, *(((char *) b)+i):28i:1, ((char *) b)+i:0x7fff1ffff609, *(((char *) b)+i):7i:2, ((char *) b)+i:0x7fff1ffff60a, *(((char *) b)+i):40i:3, ((char *) b)+i:0x7fff1ffff60b, *(((char *) b)+i):0i:4, ((char *) b)+i:0x7fff1ffff60c, *(((char *) b)+i):0i:5, ((char *) b)+i:0x7fff1ffff60d, *(((char *) b)+i):0i:6, ((char *) b)+i:0x7fff1ffff60e, *(((char *) b)+i):0i:7, ((char *) b)+i:0x7fff1ffff60f, *(((char *) b)+i):0
[root@db-172-16-3-33 zzz]# cat c.c#include <stdio.h>int main() {int a = -987654;int * b = &a;unsigned short i;unsigned short x = (unsigned short) sizeof(a);fprintf(stdout, "&a:%p, a:%i, a:%x\n", &a, a, a);for(i=0; i<x; i++) {fprintf(stdout, "i:%u, ((char *) b)+i:%p, (unsigned char) (*(((char *) b)+i)):%x\n", i, ((char *) b)+i, (unsigned char) (*(((char *) b)+i)));}return 0;}结果 :[root@db-172-16-3-33 zzz]# gcc -O3 -Wall -Wextra -Werror -g ./c.c -o c && ./c&a:0x7fffe57051cc, a:-987654, a:fff0edfa //负数是正数的反码加1, 所以得到的是这个结果.i:0, ((char *) b)+i:0x7fffe57051cc, (unsigned char) (*(((char *) b)+i)):fai:1, ((char *) b)+i:0x7fffe57051cd, (unsigned char) (*(((char *) b)+i)):edi:2, ((char *) b)+i:0x7fffe57051ce, (unsigned char) (*(((char *) b)+i)):f0i:3, ((char *) b)+i:0x7fffe57051cf, (unsigned char) (*(((char *) b)+i)):ff
#include <stdio.h>int main() {int a = -987654;int * b = &a;unsigned short i;unsigned short x = (unsigned short) sizeof(a);fprintf(stdout, "&a:%p, a:%i, a:%x\n", &a, a, a);for(i=0; i<x; i++) {fprintf(stdout, "i:%u, ((char *) b)+i:%p, (*(((char *) b)+i)):%x\n", i, ((char *) b)+i, (*(((char *) b)+i)));}return 0;}结果 :[root@db-172-16-3-33 zzz]# gcc -O3 -Wall -Wextra -Werror -g ./c.c -o c && ./c&a:0x7ffff6fada3c, a:-987654, a:fff0edfai:0, ((char *) b)+i:0x7ffff6fada3c, (*(((char *) b)+i)):fffffffai:1, ((char *) b)+i:0x7ffff6fada3d, (*(((char *) b)+i)):ffffffedi:2, ((char *) b)+i:0x7ffff6fada3e, (*(((char *) b)+i)):fffffff0i:3, ((char *) b)+i:0x7ffff6fada3f, (*(((char *) b)+i)):ffffffff
[root@db-172-16-3-33 zzz]# cat c.c#include <stdio.h>int main() {typedef struct test{unsigned char f1:1;unsigned char f2:2;unsigned char f3:3;unsigned char f4:2;} test;test t1 = {0,1,4,3};test * pt1 = &t1;fprintf(stdout, "(unsigned char) (*((unsigned char *) pt1)):%x\n", (unsigned char) (*((unsigned char *) pt1)));return 0;}结果 :[root@db-172-16-3-33 zzz]# gcc -O3 -Wall -Wextra -Werror -g ./c.c -o c && ./c(unsigned char) (*((unsigned char *) pt1)):e2
test t1 = {0,1,4,3}; 转成二进制分别如下 :f1(0) : 0f2(1) : 01f3(4) : 100f4(3) : 11
[root@db-172-16-3-33 zzz]# cat c.c#include <stdio.h>int main() {typedef struct test{unsigned char f1:1;unsigned char f2:2;unsigned char f3:3;unsigned char f4:2;} test;test t1 = {0,1,4,3};unsigned char a = (unsigned char) t1;fprintf(stdout, "a:%x\n", a);return 0;}结果 :[root@db-172-16-3-33 zzz]# gcc -O3 -Wall -Wextra -Werror -g ./c.c -o c && ./c./c.c: In function ‘main’:./c.c:11: error: aggregate value used where an integer was expected
[root@db-172-16-3-33 zzz]# cat b.c#include <stdio.h>int main() {char * a = "hello";char ** b = &a;fprintf(stdout, "&b:%p, b:%p, &a:%p, a:%p, *a:%c, a:%s\n", &b, b, &a, a, *a, a);return 0;}结果 :[root@db-172-16-3-33 zzz]# gcc -O3 -Wall -Wextra -Werror -g ./b.c -o b && ./b&b:0x7fff5319c1d8, b:0x7fff5319c1e0, &a:0x7fff5319c1e0, a:0x400628, *a:h, a:hello
[root@db-172-16-3-33 zzz]# cat b.c#include <stdio.h>int main() {char *a[1] = {"abc","def"};fprintf(stdout, "a[1]:%s\n", a[1]);return 0;}结果 :[root@db-172-16-3-33 zzz]# gcc -O3 -Wall -Wextra -Werror -g ./b.c -o b && ./bcc1: warnings being treated as errors./b.c: In function ‘main’:./b.c:4: warning: excess elements in array initializer // 超出数组长度. 因为赋值时给了2个元素, 而限定只有1个元素../b.c:4: warning: (near initialization for ‘a’)
[root@db-172-16-3-33 zzz]# cat b.c#include <stdio.h>int main() {char *a[10] = {"hello", "world"};fprintf(stdout, "a:%p, a+1:%p, &a:%p, (&a)+1:%p, *a:%p, *(a+1):%p\n", a, a+1, &a, (&a)+1, *a, *(a+1));fprintf(stdout, "*a:%s, *(a+1):%s, **a:%c, *(*(a+1)):%c\n", *a, *(a+1), **a, *(*(a+1)));return 0;}结果 :[root@db-172-16-3-33 zzz]# gcc -O3 -Wall -Wextra -Werror -g ./b.c -o b && ./ba:0x7fff9d0fb180, a+1:0x7fff9d0fb188, &a:0x7fff9d0fb180, (&a)+1:0x7fff9d0fb1d0, *a:0x4006b8, *(a+1):0x4006be*a:hello, *(a+1):world, **a:h, *(*(a+1)):w
[root@db-172-16-3-33 zzz]# cat b.c#include <stdio.h>int main() {char a[2][10] = {"hello", "world", "linux"};return 0;}结果 :[root@db-172-16-3-33 zzz]# gcc -O3 -Wall -Wextra -Werror -g ./b.c -o b && ./bcc1: warnings being treated as errors./b.c: In function ‘main’:./b.c:4: warning: excess elements in array initializer // 1维在赋值时给出了3个元素"hello" , "world" , "linux" 因此告警了, 可能导致内存溢出../b.c:4: warning: (near initialization for ‘a’)./b.c:4: warning: unused variable ‘a’
[root@db-172-16-3-33 zzz]# cat b.c#include <stdio.h>int main() {char a[2][10] = {"helloxxxxxxxx", "world"};return 0;}[root@db-172-16-3-33 zzz]# gcc -O3 -Wall -Wextra -Werror -g ./b.c -o b && ./bcc1: warnings being treated as errors./b.c: In function ‘main’:./b.c:4: warning: initializer-string for array of chars is too long./b.c:4: warning: (near initialization for ‘a[0]’)./b.c:4: warning: unused variable ‘a’
[root@db-172-16-3-150 zzz]# cat a.c#include <stdio.h>int main() {char a[2][6] = {"hello", "world"};fprintf(stdout, "sizeof(a):%lu\n", sizeof(a)); // a数组占用空间fprintf(stdout, "&a:%p, (&a)+1:%p\n", &a, (&a)+1); // a数组首地址, a数组首地址加1fprintf(stdout, "a:%p, a+1:%p\n", a, a+1); // a数组1维度第1个元素首地址, 加1fprintf(stdout, "*a:%p, *(a)+1:%p\n", *a, *(a)+1); // a数组1维度第1个元素中的第1个元素首地址, 加1return 0;}结果 :[root@db-172-16-3-150 zzz]# gcc -O3 -Wall -Wextra -Werror -g ./a.c -o a && ./asizeof(a):12&a:0x7ffffe5cf8b0, (&a)+1:0x7ffffe5cf8bc // 加12个字节a:0x7ffffe5cf8b0, a+1:0x7ffffe5cf8b6 // 加6个字节*a:0x7ffffe5cf8b0, *(a)+1:0x7ffffe5cf8b1 // 加1个字节
[root@db-172-16-3-150 zzz]# cat a.c#include <stdio.h>int main() {char a[2][6] = {"hello", "world"};fprintf(stdout, "&a:%p, a:%p, *a:%p\n", &a, a, *a);fprintf(stdout, "(*(a+0))+1:%p, &a[0][1]:%p\n", (*(a+0))+1, &a[0][1]);fprintf(stdout, "a+1:%p, &a[1]:%p, *(a+1):%p, a[1]:%p\n", a+1, &a[1], *(a+1), a[1]);fprintf(stdout, "(*(a+1))+1:%p, &a[1][1]:%p\n", (*(a+1))+1, &a[1][1]);fprintf(stdout, "(&a)+1:%p\n", (&a)+1);return 0;}结果 :[root@db-172-16-3-150 zzz]# gcc -O3 -Wall -Wextra -Werror -g ./a.c -o a && ./a&a:0x7fff5c94e670, a:0x7fff5c94e670, *a:0x7fff5c94e670(*(a+0))+1:0x7fff5c94e671, &a[0][1]:0x7fff5c94e671a+1:0x7fff5c94e676, &a[1]:0x7fff5c94e676, *(a+1):0x7fff5c94e676, a[1]:0x7fff5c94e676(*(a+1))+1:0x7fff5c94e677, &a[1][1]:0x7fff5c94e677(&a)+1:0x7fff5c94e67c
[root@db-172-16-3-150 zzz]# cat a.c#include <stdio.h>int main() {char a[2][6] = {"hello", "world"};fprintf(stdout, "a+1:%s\n", a+1);return 0;}[root@db-172-16-3-150 zzz]# gcc -O3 -Wall -Wextra -Werror -g ./a.c -o a && ./acc1: warnings being treated as errors./a.c: In function ‘main’:./a.c:5: warning: format ‘%s’ expects type ‘char *’, but argument 3 has type ‘char (*)[6]’
[root@db-172-16-3-150 zzz]# cat a.c#include <stdio.h>int main() {char a[2][6] = {"hello", "world"};fprintf(stdout, "a+1:%s\n", (char *) (a+1));return 0;}[root@db-172-16-3-150 zzz]# gcc -O3 -Wall -Wextra -Werror -g ./a.c -o a && ./aa+1:world
[root@db-172-16-3-150 zzz]# cat a.c#include <stdio.h>int main() {char a[2][6][6] = {{"hello", "world"},{"linux", "digoal"}};fprintf(stdout, "a+1:%s\n", (a+1));return 0;}结果[root@db-172-16-3-150 zzz]# gcc -O3 -Wall -Wextra -Werror -g ./a.c -o a && ./acc1: warnings being treated as errors./a.c: In function ‘main’:./a.c:5: warning: format ‘%s’ expects type ‘char *’, but argument 3 has type ‘char (*)[6][6]’[root@db-172-16-3-150 zzz]# cat a.c#include <stdio.h>int main() {char a[2][6][6] = {{"hello", "world"},{"linux", "digoal"}};fprintf(stdout, "a+1:%s\n", *(a+1));return 0;}结果[root@db-172-16-3-150 zzz]# gcc -O3 -Wall -Wextra -Werror -g ./a.c -o a && ./acc1: warnings being treated as errors./a.c: In function ‘main’:./a.c:5: warning: format ‘%s’ expects type ‘char *’, but argument 3 has type ‘char (*)[6]’[root@db-172-16-3-150 zzz]# cat a.c#include <stdio.h>int main() {char a[2][6][6] = {{"hello", "world"},{"linux", "digoal"}};fprintf(stdout, "a+1:%s\n", (char *) (a+1));return 0;}结果[root@db-172-16-3-150 zzz]# gcc -O3 -Wall -Wextra -Werror -g ./a.c -o a && ./aa+1:linux
联系客服