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

Cri*_*s B 0 c c++ pointers dereference visual-c++

在开始使用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;
}
Run Code Online (Sandbox Code Playgroud)

Ret*_*nja 7

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

如果你必须使用指针,快速解决方法是使用临时指针,如:

int *sortedArray = (int*)malloc(size*sizeof(int));
int* s = sortedArray;
for (int i = 0; i < size;i++){
    *s++ = *data++;
}
Run Code Online (Sandbox Code Playgroud)

另一种方式是:

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

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

这是第一个修复的演示.