C ++指针解除引用的赋值

时间:2014-06-12 01:32:09

标签: c++ c pointers visual-c++ dereference

在开始使用std :: copy或memcpy之类的抽象之前,我首先尝试通过低级细节来学习C ++。目前我一直在努力弄清楚为什么这段代码永远不会分配到" sortedArray"变量,当用调试器查找时,我取消引用" data"的值。正确但它从未分配给" 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;
}

4 个答案:

答案 0 :(得分:7)

*(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

这是第一个问题的demo

答案 1 :(得分:2)

更改

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

sortedArray[i] = data[i];

你需要保留指向你分配的内存块的指针,这样你就可以在以后使用它(并释放它)。

请注意,使用*(x+y)语法而不是x[y]无法获得任何结果,它们是等效的,但后者更易于阅读。

在C ++中,您不应该使用malloc。而是使用new int[size]。对于int,除了降低拼写错误的风险之外没有其他区别,但是对于非平凡类型malloc将无法正确构造它们。

答案 2 :(得分:1)

根本不是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;
    }
}

Live demo

std::iter_swapstd::swap类似,但适用于迭代器。您可以将迭代器视为指向容器开头和(过去)末尾的一对指针。

答案 3 :(得分:1)

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

然后在第一个for循环中增加指针。不是它不再指向那个记忆了。

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

int* t = sortedArray ;

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

而不是临时变量,您可以计算在for循环中调用sortedArray++的次数。

如果你看一下:for (int i = 0; i < size;i++),你会看到循环完全size次迭代。

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

sortedArray -= size ;