long blogs

进一步有进一步惊喜


  • Home
  • Archive
  • Tags
  •  

© 2025 long

Theme Typography by Makito

Proudly published with Hexo

C-Base

Posted at 2020-09-03 笔记 C 

计算数组的大小

sizeof(数组名) 获得这个数组占用内存的总长度。二维数组是全部元素占用的总长度。

长度 = sizeof(数组名) / sizeof(数组类型)

元素个数 = 总的占用字节大小 / 每个元素占用的字节大小

64位指针占用8字节,8×8=64,内存寻址。

计算一维数组长度

例子1:

1
2
3
4
5
char *sc4[] ={"hello","world","Welcome","C"};
printf("arr total byte = %ld\n",sizeof(sc4));
printf("arr single element byte = %ld\n",sizeof(sc4[0]));
printf("arr length = %ld\n",sizeof(sc4)/sizeof(sc4[0]));
printf("arr length = %ld\n",sizeof(sc4)/sizeof(*sc4));

输出:

1
2
3
4
5
6
arr total byte = 32
arr single element byte = 8
arr length = 4
arr length = 4
arr total byte = 32

例子2:

1
2
3
4
5
int n[8] = {1,2,3,4,5};
printf("arr total byte = %ld\n",sizeof(n));
printf("arr single element byte = %ld\n",sizeof(n[0]));
printf("arr length = %ld\n",sizeof(n)/sizeof(n[0]));
printf("arr length = %ld\n",sizeof(n)/sizeof(*n));

输出:

1
2
3
4
5
arr total byte = 32
arr single element byte = 4
arr length = 8
arr length = 8

计算二维数组长度

例子1:

1
2
3
4
5
6
7
8
char* arr2[2][3];
printf("total byte = %ld\n",sizeof(arr2));
printf("row byte = %ld\n",sizeof(arr2[0]));
printf("column byte = %ld\n",sizeof(arr2[0][0]));
printf("rows = %ld\n",sizeof(arr2) / sizeof(arr2[0]));
printf("rows = %ld\n",sizeof(arr2) / sizeof(*arr2));
printf("columns = %ld\n",sizeof(arr2[0])/sizeof(arr2[0][0]));
printf("columns = %ld\n",sizeof(*arr2)/sizeof(**arr2));

输出:

1
2
3
4
5
6
7
8
total byte = 48
row byte = 24
column byte = 8
rows = 2
rows = 2
columns = 3
columns = 3

例子2:

定义一个结构体:

1
2
3
4
typedef struct People_s {
char *name;
int age;
}People;
1
2
3
4
5
6
7
8
People arr3[3][9];
printf("total byte = %ld\n",sizeof(arr3));
printf("row byte = %ld\n",sizeof(arr3[0]));
printf("column byte = %ld\n",sizeof(arr3[0][0]));
printf("rows = %ld\n",sizeof(arr3) / sizeof(arr3[0]));
printf("rows = %ld\n",sizeof(arr3) / sizeof(*arr3));
printf("columns = %ld\n",sizeof(arr3[0])/sizeof(arr3[0][0]));
printf("columns = %ld\n",sizeof(*arr3)/sizeof(**arr3));

输出:

1
2
3
4
5
6
7
total byte = 432
row byte = 144
column byte = 16
rows = 3
rows = 3
columns = 9
columns = 9

valgrind 检查内存泄漏

valgrind --leak-check=full --track-origin=yes ./test

C的字符串数组

第一种情况,每一个都是指针

1
2
3
4
5
6
7
char **arr = NULL;
// 10 个字符串
arr = calloc(10, sizeof(char *));
arr[0] = calloc(1, 100);
strcpy(arr[0], "Hello");
arr[1] = calloc(1, 100);
strcpy(arr[1], "World");

第二种情况,确定字符串的个数,但每个字符串长度不确定

1
2
3
4
5
6
7
8
9
char *print2[10];
for (int i = 0; i < 10; ++i) {
print2[i] = calloc(1, i + 2);
sprintf(print2[i], "%d", i);
}
for (int i = 0; i < 10; ++i) {
printf("%s\n", print2[i]);
free(print2[i]);
}

第三种情况,字符串的个数和字符串的长度已经确定

1
2
3
4
char print[2][10] = {"Hello", "World"};
for (int i = 0; i < 2; ++i) {
printf("%s\n", print[i]);
}

Share 

 Previous post: C-宏注入及其应用 Next post: C-多线程 

© 2025 long

Theme Typography by Makito

Proudly published with Hexo