0
点赞
收藏
分享

微信扫一扫

利用SQL注入漏洞登录后台

RockYoungTalk 2023-06-20 阅读 57

Declare an array manually  VS  malloc or calloc an array

栈和堆

我们在main声明一个数组叫a,可以说this is a static array

=> 在中main scope里把开辟一片连续的内存交给a,a是一片内存

而用malloc或者calloc开辟数组是用指针指向堆一块内存区域,并且要注意的是一开始具体指向的就是第一个数据,所谓的它能指向一片区域是因为数据存放在一起的,移动指针可以到下一个

#include <stdio.h>
#include <stdlib.h>

int main() {
	int *arr = (int*)malloc(sizeof(int)*10);
	printf("%d\n", sizeof(int));
	printf("arr: %p\narr + 1: %p\n&arr: %p\n&arr + 1: %p\n",arr, arr+1, &arr, &arr+1);
	printf("%d\n", sizeof(arr)/sizeof(arr[0]));
	int a[5] = {1, 2, 3, 4, 5};
	printf("a: %p\na + 1: %p\n&a: %p\n&a + 1: %p\n",a, a+1, &a, &a+1);
	printf("%d\n", sizeof(a)/sizeof(a[0]));
	return 0;
}

sizeof是运算符,本质是通过偏转量来确定字节数 => sizeof(a) == (a + 1) - a

前面说过数组名a代表的是一片内存,如果它+1的话得到的是下一片内存的地址啦

做差不就是这篇内存的总字节数吗?再除以int的单位字节数就是这个数组的长度

但是malloc或calloc出来的数组不能通过这种方法来获取数组长度

因为他们有本质区别:malloc的arr是一个指针,sizeof(arr)得到的就是arr指针的大小,并不是一整片int数据所在的内存总字节数

想其他函数传数组也一样,其实是用指针接受从main scope传来的数组首地址,用sizeof获取数组长度同样不科学

=> 要想用sizeof获取数组长度仅限于在同一scope中declare 的 a static array

 

字符数组以及字符串常量

挖个坑,以后有空再来填上

 

 

举报

相关推荐

0 条评论