C 动态数组元素访问

标签 c arrays

我正在学习 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/

相关文章:

c - 如何以特定方式打印十六进制?

python - 如何在一维数组中找到槽

PHP 代码一直有效,直到我将它变成一个函数

c - 数据对齐问题

c - 在 C 中发出清除输入流

c - 如何将服务器的日期时间转换为unix时间戳?

c - 设置二维数组,稍后更改大小 - C

java - 使用无参数构造函数添加到数组

c - 分配 char*[] 结构数据元素会发出警告

c++ - malloc如何分配小于4KB的内存?