使用冒泡排序,排序好的数组然后调用一个打印函数,打印出来的值莫名其妙的改变了。
使用gdb调试,进入打印函数printArray之前的数组值是正确的,也是排好序的,并且调用打印函数的时候数组值也是正确的,但是一旦运行printArray函数里面的任何一个语句,哪怕是第一条printf语句,数组的值就完全变了。不知道什么原因?
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define LENGTH 10
int *randArray(int length){
int i,number;
srand((unsigned) time(NULL));//时间做种,每次产生随机数不一样
int array[length];
int *p = array;
printf("initial array:");
for(i=0;i<length;i++){
number = rand()%101;//产生0-100的随机数
array[i] = number;
printf("%d->",number);
}
printf("\n");
return p;
}
void printArray(int *array,int length){
printf("sorted Array:");
for(int i=0;i<length;i++){
printf("%d->",array[i]);
}
printf("\n");
}
//排序算法
//1.冒泡排序
int *bubblesort(int *pData,int count){
//count为数组的大小
int i,j;
int temp;
for(i=1;i<count;i++){
for(j=0;j<count-i;j++){
if(pData[j]>pData[j+1]){
temp = pData[j];
pData[j] = pData[j+1];
pData[j+1] = temp;
}
}
}
return pData;
}
int main(int argc,char *argv[]){
//冒泡排序
int *array = randArray(LENGTH);
int *sortedArray = bubblesort(array,LENGTH);
/*
for(int i=0;i<20;i++){
printf("%d->",sortedArray[i]);
}
printf("\n");*/
printArray(sortedArray,LENGTH);
return 0;
}
打印信息:
kevin@duguangtingdeMacBook-Pro:~/Desktop/DataStructure/算法合集 $ ./a.out
initial array:68->78->67->17->36->42->100->35->78->80->
sorted Array:17->35->36->42->16->48->1450224528->32767->1450224272->32767->
gdb调试信息:
-
进入printArray函数时候:
printArray (array=0x7fff5fbffbb0, length=10) at allAlgorithm.c:28
28 printf("sorted Array:");
(gdb) p array[9]
$30 = 96
(gdb) p array[8]
$31 = 73 -
array的地址
(gdb) p array
$32 = (int *) 0x7fff5fbffbb0
(gdb) p &array[9]
$33 = (int *) 0x7fff5fbffbd4 -
运行一条语句之后
(gdb) n
29 for(int i=0;i<length;i++){
(gdb) p &array[9]
$34 = (int *) 0x7fff5fbffbd4
(gdb) p array[8]
$35 = 1606417168 -
更详细一点的信息
62 printArray(sortedArray,LENGTH);
(gdb) x/10d array
0x7fff5fbffbb0: 0 5 10 47
0x7fff5fbffbc0: 62 73 77 82
0x7fff5fbffbd0: 90 94
(gdb) x/10d sortedArray
0x7fff5fbffbb0: 0 5 10 47
0x7fff5fbffbc0: 62 73 77 82
0x7fff5fbffbd0: 90 94
(gdb) s
printArray (array=0x7fff5fbffbb0, length=10) at allAlgorithm.c:28
28 printf("sorted Array:");
(gdb) x/10d array
0x7fff5fbffbb0: 0 5 10 47
0x7fff5fbffbc0: 62 73 77 82
0x7fff5fbffbd0: 90 94
(gdb) n
29 for(int i=0;i<length;i++){
(gdb) x/10d array
0x7fff5fbffbb0: 0 5 10 47
0x7fff5fbffbc0: 8 48 1606417424 32767
0x7fff5fbffbd0: 1606417168 32767 -
如果直接在main中打印,是没有问题的
kevin@duguangtingdeMacBook-Pro:~/Desktop/DataStructure/算法合集 $ ./a.out
initial array:81->6->27->49->82->54->56->13->60->69->
6->13->27->49->54->56->60->69->81->82->
kevin@duguangtingdeMacBook-Pro:~/Desktop/DataStructure/算法合集 $
函数执行完了,要把局部变量销毁。问题就在这里