指针作为 C++ 结构中的成员数据字段

Posted

技术标签:

【中文标题】指针作为 C++ 结构中的成员数据字段【英文标题】:Pointers as member data fields in C++ structs 【发布时间】:2019-06-20 10:11:56 【问题描述】:
#include <iostream>
using std::cout;
using std::cin;

void printArray(int A[], int size) 
    for(int i = 0; i < size; i++) 
        cout << A[i] << "\t";
    
    cout << "\n";


struct Array 
    int *A;
    int size;
    int length;
;

void display(Array *arr) 
    for(int i = 0; i < arr->length; i++) 
        cout << arr->A[i] << "\t";
    
    cout << "\n";


void fillArray(Array *arr) 
    for(int i = 0; i < arr->length; i++) 
        cin >> arr->A[i];
    


void add(Array *arr, int x) 
    if(arr->length < arr->size) 
        arr->A[++arr->length] = x;
    


int main() 
    Array arr;
    cout << "arr.size before initializing: " << arr.size << "\n"; // gives a garbage value
    cout << "Enter the size of the array: ";
    cin >> arr.size;
    cout << "Output of arr variable &arr: " << &arr << "\n";
    arr.A = new int[arr.size];
    cout << "arr.length before initializing: " << arr.length << "\n"; // gives garbage value
    cout << "How many elements do you want to enter: ";
    cin >> arr.length;
    fillArray(&arr); //This is not pass by value but pass by reference because 
    display(&arr); // this function displays the values of arr
    add(&arr, 15);
    cout << "The length of the array after adding: " << arr.length << "\n";
    display(&arr);
    printArray(arr.A, arr.length);

这个程序的输出是这样的:

$ ./array_adt 
arr.size before initializing: -140717888
Enter the size of the array: 10
Output of arr variable &arr: 0x7ffe4e0ec040
arr.length before initializing: 21932
How many elements do you want to enter: 5
4 6 7 3 2 
4   6   7   3   2   
The length of the array after adding: 6
4   6   7   3   2   0   
4   6   7   3   2   0

我很困惑为什么不将元素 15 添加到结构的数组中(这实际上是一个指针,它被初始化为堆中的数组)。如果有人能阐明这一点,那对很多人以及深入理解 C++ 概念都会非常有用。 非常感谢。

【问题讨论】:

格式良好的程序不允许读取未初始化变量的值。这样做就是使程序的行为未定义。这意味着编译器可以做各种你在翻译代码时不想做的事情。删除所有打印未初始化变量的行,即使没有引起问题,它们也会产生错误的代码。 你的意思是我打印数组的所有行?即函数displayprintArray ? 我的意思是“初始化之前的 arr.size” - 你在这里读到 arr.size 时它仍然有一个不确定的值。 C++ 标准不允许这样做,原因是未定义的行为。 我只是在艰难地学习 C++ 而已:) 哈哈。 【参考方案1】:
arr->A[++arr->length] = x;

应该是

arr->A[arr->length++] = x;

数组索引在 C++ 中从零开始,因此大小为N 的数组arr 的第一个元素结束arr[N]。换句话说,15 确实被添加到了数组中,只是位置不正确。

您的代码也会泄漏内存,因为main 中分配的数组永远不会被删除。正确分配动态内存是一个很大(而且非常重要)的话题。查阅你最喜欢的 C++ 书籍,特别是你应该研究rule of three

【讨论】:

还有内存泄漏 这是真的,但我猜一次有一个问题。关于如何正确处理类中的动态分配的完整解释比我想给出的要多。 IMO 内存泄漏在任何情况下都不应被忽略。如果您将其添加到您的答案中以供以后阅读它的人使用,那就太好了。 aah 是的,真是个愚蠢的错误,哦,是的,我知道内存泄漏,目前想了解在结构中声明数组的概念。我认为在main 末尾添加delete []arr.A 有效。

以上是关于指针作为 C++ 结构中的成员数据字段的主要内容,如果未能解决你的问题,请参考以下文章

成员结构的值在作为指针传递给函数后丢失

从 C++ 的成员函数中获取指向成员函数的指针

Swig:将成员变量(指向值的指针)转换为 python 列表

C++基础之类和对象二

有啥方法可以控制 C++ 中结构成员(包括位字段)之间的填充?

面向对象c++判断题总结