我正在学习 C 并尝试构建一个动态数组。我找到了一个很棒的教程,但我没有完全理解。我现在的代码是
typedef struct{
int size;
int capacity;
char *data;
}Brry;
void brry_init(Brry *brry){
brry->size = 0;
brry->capacity = 2;
brry->data = (char *)calloc(brry->capacity, sizeof(char));
}
void brry_insert(Brry *brry, char value){
brry->data[brry->size++] = value; //so do check here if I have enough memory, but checking something out
}
int main(void){
Brry brry;
brry_init(&brry);
for (int i = 0; i < 3; i++) {
brry_insert(&brry, 'a');
}
printf("%c\n", brry.data[2]);
return 0;
}
在我的 main 函数中,我向数组添加了 3 个元素,但它只分配了 2 个元素。但是当我打印它时,它工作得很好吗?我预计会打印一些奇怪的值。这是为什么还是我做错了什么?
最佳答案
您正在写入未分配足够内存的缓冲区。无法保证其有效。
您现在尝试的是从内存中读取一些垃圾值,谁知道呢,这有时会导致段错误,而有时您很幸运并获得一些垃圾值,并且不会出现段错误。
写入垃圾内存将调用未定义的行为,因此最好注意它。 如果确实出现错误,那么它几乎总是段错误,是段错误的缩写。 阅读它 here .
通过读取数组边界所做的事情的技术称为解除指针引用。您可能还想了解更多相关信息 here .
关于C 动态数组元素访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20448113/