繁体   English   中英

C ++指针解引用分配

[英]C++ Pointer Dereferenced Assignment

在尝试使用诸如std :: copy或memcpy之类的抽象之前,我试图通过首先了解低级细节来学习C ++。 目前,我一直试图弄清楚为什么此代码从未分配给“ sortedArray”变量,当与调试器一起查看时,我正确地从“数据”中取消引用了值,但从未将其分配给“ sortedArray”。 我看到第一个值是“ -842150451”而不是“ 14”。 您能帮我弄清楚我做错了什么吗? 还有我看不见的任何其他问题或意见将不胜感激!

void swap(int* bigger, int* smaller){
    *bigger += *smaller;
    *smaller = *bigger - *smaller;
    *bigger = *bigger - *smaller;
}

int* bubbleSort(int *data, int size){
    bool swapped = true;
    int *sortedArray = (int*)malloc(size*sizeof(int));
    for (int i = 0; i < size;i++){
        *(sortedArray++) = *(data++);
    }

    while (swapped){
        swapped = false;
        for (int i = 1; i <= size - 1; i++){
            if (sortedArray[i - 1] > sortedArray[i]){
                swap(&sortedArray[i - 1], &sortedArray[i]);
                swapped = true;
            }
        }
        size--;
    }
    return sortedArray;
}

*(sortedArray++) = *(data++); 修改指针,使其不再指向分配的内存的开始。 因此,稍后sortedArray[i]会在数组中的内存中发生任何事情,而访问它是未定义的行为。

如果必须使用指针,一个快速的解决方法是使用一个临时指针,例如:

int *sortedArray = (int*)malloc(size*sizeof(int));
int* s = sortedArray;
for (int i = 0; i < size;i++){
    *s++ = *data++;
}

另一种方法是:

int *sortedArray = (int*)malloc(size*sizeof(int));
for (int i = 0; i < size;i++){
    sortedArray[i] = data[i];
}

但是,最好的方法是使用标准容器和算法,例如vectorsort

这是第一个修复的演示

更改

*(sortedArray++) = *(data++);

sortedArray[i] = data[i];

您需要保留指向分配的内存块的完整指针,以便以后可以使用它(并释放它)。

请注意,使用*(x+y)语法代替x[y]并不会获得任何收益,它们是等效的,但后者更易于阅读。

在C ++中,不应使用malloc 而是使用new int[size] 对于int来说,除了减少打字错误的风险外没有其他区别,但是对于非平凡类型, malloc不会正确构造它们。

那根本不是C ++。 您可以编写采用begin迭代器和end迭代器的通用代码,以使其与支持这种语义的任何类型的容器一起工作。

template<typename IT>
void bubble_sort(IT begin, IT end) {
    while (true) {
        bool swapped = false;
        for (IT i = begin; i != end-1; i = i+1) {
            if (*i > *(i+1)) {
                std::iter_swap(i, i+1);
                swapped = true;
            }
        }
        if (swapped == false) return;
    }
}

现场演示

其中std::iter_swap类似于std::swap但适用于迭代器 您可以将迭代器视为指向容器开始和结束位置的一对指针。

您的第一个指针sortedArray指向一些已分配的内存。

然后在第一个for循环中,增加指针。 不是,它不再指向该内存。

只需使用临时指针进行内存复制即可。

int* t = sortedArray ;

现在在要复制数据的for循环中使用t

除了临时变量,您还可以计算在for循环中调用sortedArray++的次数。

如果您看一看: for (int i = 0; i < size;i++)您将看到循环恰好具有迭代的size数。

只需在循环后从指针中减去大小,便可以指向已分配的内存。

sortedArray -= size ;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM