使用函数调用打印数组,数组的值莫名其妙的改变了?

使用冒泡排序,排序好的数组然后调用一个打印函数,打印出来的值莫名其妙的改变了。

使用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调试信息:

  1. 进入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

  2. array的地址

    (gdb) p array
    $32 = (int *) 0x7fff5fbffbb0
    (gdb) p &array[9]
    $33 = (int *) 0x7fff5fbffbd4

  3. 运行一条语句之后

    (gdb) n
    29 for(int i=0;i<length;i++){
    (gdb) p &array[9]
    $34 = (int *) 0x7fff5fbffbd4
    (gdb) p array[8]
    $35 = 1606417168

  4. 更详细一点的信息

    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

  5. 如果直接在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/算法合集 $

阅读 3.4k
2 个回答

函数执行完了,要把局部变量销毁。问题就在这里

randArray函数返回的是局部变量的指针,保存在栈上,调用其他函数之后被覆盖掉了。应该是

int * array = (int *)malloc(length * sizeof(int));
int * p = array;

另外申请一块内存就好了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进