我是一个初学者,当涉及到C.仍然,当数组是动态分配,为什么类型通常被保存为第一个元素的指针在动态分配的内存块?相反,它可以被分配给(指针)一个数组类型的长度等于什么被分配?
我做了一个示例程序,展示了只使用指向数组第一个元素的指针的“传统”版本和将其分配给数组(指向数组的指针)的“数组”版本。
#include <stdio.h>
#include <stdlib.h>
#define ARR_SIZE 10
int main() {
// Option 1: Pointer to type (first element)
// Create pointer to int for the dynamically allocated array
// Size information stored in ARR_SIZE
int *arr_ptr = malloc(sizeof(int) * ARR_SIZE);
// Do something to each element
printf("Option 1: int pointer\n");
for(size_t i = 0; i < ARR_SIZE; i++) {
printf("i: %zu\n", i);
arr_ptr[i] = i;
}
// Option 2: Assign to (a pointer to) an array type
// Since we assign it to (a pointer to) an array type of correct size, we embed the size information into the type
int (*arr_ptr2)[ARR_SIZE] = malloc(sizeof(int) * ARR_SIZE);
// Do something to each element
printf("Option 2: assign to array pointer\n");
// No longer need to use ARR_SIZE as the size information is stored in the array type
for(size_t i = 0; i < sizeof(*arr_ptr2)/sizeof(int); i++) {
printf("i: %zu\n", i);
(*arr_ptr2)[i] = i;
}
// Print some size information
printf("Size of int: %zu\n", sizeof(int)); // Prints 4
printf("Size of *arr_ptr: %zu\n", sizeof(*arr_ptr)); // Prints 4
printf("Size of *arr_ptr2: %zu\n", sizeof(*arr_ptr2)); // Prints 40
// Free memory ...
return 0;
}
字符串
此示例显示,数组类型的指针意味着数组的长度“嵌入”在类型本身中,因此可以从变量本身获得分配的内存块的大小,而不需要“大小变量”。虽然这可能不是分配给数组类型的好处的最好例子,但我想还有其他好处,例如清楚地表明该变量是元素数组而不是指向单个元素的指针。
把它赋值给这样的数组类型有什么缺点吗?或者仅仅使用指针的好处会超过潜在的好处吗?例如,由于数组无论如何都会衰减为指针,这会是一个麻烦的“额外步骤”吗?
感谢您提供的任何见解和澄清!
1条答案
按热度按时间m1m5dgzv1#
.当一个数组是动态分配的,为什么类型通常作为指向动态分配的内存块中第一个元素的指针保存?
1.记法更简单。如果
p
的类型是指向元素的指针,那么p[i]
就是元素i
。如果类型是指向数组的指针,那么(*p)[i]
就是元素i
。早期的C语言设计得很简洁。1.早期的C语言主要处理标量对象,而使用带有数组索引的指针(
p[i]
)提供了一种访问数组元素的简单方法,而不必为语言添加对更复杂类型和表达式的支持。1.我们经常希望使用动态分配的内存,其大小在运行时确定,例如从输入或文件中读取的字符串。使用指向数组的指针,其类型在编译时未知,这将要求数组具有可变长度类型或不完整类型。可变长度类型在早期C中不存在,我不相信不完整类型定义良好,如果它们存在的话。(“不完整”在克尼汉和里奇第二版的索引中,但不在第一版中。)