dal*_*oss 1 c memory arrays system
我知道多维数组是连续分配的,因此int[4][3] arr;将连续分配 12 个 int 单元格。
我的第一个问题是,鉴于 C 不跟踪数组的长度,它如何知道将两个坐标访问模式转换为单个坐标内存地址所需的正确算法?例如,如果
arr == 0x? // some memory address
Run Code Online (Sandbox Code Playgroud)
然后
&arr[2][1] == 0x? + 3 * 2 int cells + 1 int cell.
Run Code Online (Sandbox Code Playgroud)
哪来的3个?
我的第二个问题是在堆上分配数组时,它们是否仍然以相同的连续方式分配?或者它是作为一个指针数组实现的,它取消了对一维数组的引用?
C 确实跟踪数组长度,但只在编译时,而不是在运行时(它不保存在数组结构中):
#include <stdio.h>
int main(int argc, char **argv)
{
char array[] = "hello world";
char* char_ptr = array;
printf("array size: %lu\n", sizeof(array));
printf("char_ptr size: %lu\n", sizeof(char_ptr));
printf("void_ptr size: %lu\n", sizeof(void*));
int matrix[2][3] = {{1,2,3},{4,5,6}};
printf("matrix size (items): %lu\n", sizeof(matrix)/sizeof(int));
return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)
输出:
array size: 12
char_ptr size: 8
void_ptr size: 8
matrix size (items): 6
Run Code Online (Sandbox Code Playgroud)
C 中有一个细微差别,数组会自动转换为指针,但指针和数组(在编译时声明)对于编译器来说仍然是两种不同的类型。
| 归档时间: |
|
| 查看次数: |
213 次 |
| 最近记录: |