在开始使用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;
}
答案 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];
}
但是,最好的方法是使用标准容器和算法,例如vector
和sort
。
这是第一个问题的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;
}
}
std::iter_swap
与std::swap
类似,但适用于迭代器。您可以将迭代器视为指向容器开头和(过去)末尾的一对指针。
答案 3 :(得分:1)
第一个指针sortedArray
指向一些已分配的内存。
然后在第一个for循环中增加指针。不是它不再指向那个记忆了。
只需使用临时指针进行内存复制。
int* t = sortedArray ;
现在在for循环中使用t
复制数据。
而不是临时变量,您可以计算在for循环中调用sortedArray++
的次数。
如果你看一下:for (int i = 0; i < size;i++)
,你会看到循环完全size
次迭代。
只需在循环后从指针中减去大小,然后指向已分配的内存。
sortedArray -= size ;