使用指针作为动态分配的数组

时间:2014-08-25 15:56:00

标签: c arrays malloc

我试图编写一个为数组动态分配内存的程序,然后用户用整数值填充该程序,程序对所述整数值进行排序。但是,似乎我的阵列没有按预期工作。我已经设法让程序使用静态数组,但动态分配导致我很多问题,不正确的值和诸如此类的东西。这是我到目前为止动态分配的版本(如果它可以帮助你们,我也可以提供使用静态数组的版本):

#include <stdio.h>
#include "genlib.h"
#include "simpio.h"

void sortArray (int *numbers, int i2); 
int indexMax (int *numbers, int low, int high);
void swap (int *num1, int *num2);
int getArray (int *numbers);
void displayArray (int *numbers, int i2);

main()
{
    int *numbers, i2;
    i2=getArray(numbers); 
    sortArray(numbers, i2); 
    displayArray (numbers, i2); 
}

int getArray (int *numbers)
{
    int i, i2;
    printf("Please enter the amount of elements you wish to sort: ");
    i2=GetInteger();
    numbers=(int *)malloc(i2*sizeof(int));
    for(i=0;i<i2;i++, numbers++)
    {
        printf("Enter next integer: ");
        *numbers=GetInteger();
        printf("\n");
    }
    return(i2);
}

void displayArray (int *numbers, int i2)
{
    int i;
    printf ("\nThe sorted list is: \n\n");
    for (i=0;i<i2;i++, numbers++)printf ("%d\n", *numbers); 
}

void sortArray (int *numbers, int i2)
{
    int i, minInd;
    for(i=0;i<i2;i++)
    {
        minInd=indexMax(numbers, i, i2-1);
        swap(&numbers[i], &numbers[minInd]);        
    }
}

int indexMax (int *numbers, int low, int high)
{
    int i, maxInd;
    maxInd=high;
    for (i=high;i>=low;i--)
    {
        if(*(numbers+i)>*(numbers+maxInd)) maxInd=i;
    }
    return (maxInd);
}

void swap (int *num1, int *num2)
{
    int temp;
    temp=*num1;
    *num1=*num2;
    *num2=temp;
}    

3 个答案:

答案 0 :(得分:0)

试试这个:

int main(void)
{
    int *numbers, i2;
    i2 = getArray(&numbers); 
    sortArray(numbers, i2); 
    displayArray (numbers, i2); 

    return 0;
}

int getArray (int **numbers)
{
    int i, i2;
    printf("Please enter the amount of elements you wish to sort: ");
    i2 = GetInteger();
    *numbers = malloc(i2 * sizeof int);

等...

您只需要一个更高级别的间接使int getArray(int**)返回指向已分配数组的指针。

答案 1 :(得分:0)

这是一个有效的解决方案:

#include <stdio.h>
#include <stdlib.h>

void sortArray (int *numbers, int i2); 
int indexMax (int *numbers, int low, int high);
void swap (int *num1, int *num2);
int getArray (int **numbers);
void displayArray (int *numbers, int i2);

main()
{
    int *numbers, i2;
    i2=getArray(&numbers); 
    sortArray(numbers, i2); 
    displayArray (numbers, i2); 
}

int getArray (int **numbers)
{
    int i, i2;
    printf("Please enter the amount of elements you wish to sort: ");
    scanf("%d", &i2);
    (*numbers) = malloc(i2 * sizeof(int));
    int *temp = *numbers;
    for(i = 0; i < i2; i++)
    {
        printf("Enter next integer: ");
        scanf("%d", &temp[i]);
        printf("\n");
    }
    return(i2);
}

void displayArray (int *numbers, int i2)
{
    int i;
    printf ("\nThe sorted list is: \n\n");
    for (i=0;i<i2;i++, numbers++)printf ("%d\n", *numbers); 
}

void sortArray (int *numbers, int i2)
{
    int i, minInd;
    for(i=0;i<i2;i++)
    {
        minInd=indexMax(numbers, i, i2-1);
        swap(&numbers[i], &numbers[minInd]);        
    }
}

int indexMax (int *numbers, int low, int high)
{
    int i, maxInd;
    maxInd=high;
    for (i=high;i>=low;i--)
    {
        if(*(numbers+i)>*(numbers+maxInd)) maxInd=i;
    }
    return (maxInd);
}

void swap (int *num1, int *num2)
{
    int temp;
    temp=*num1;
    *num1=*num2;
    *num2=temp;
}

当你声明int *数字时,事情就在你的主要部分,数字指针指向一些垃圾内存位置,因为局部变量可以有任何垃圾值,所以当你将这个数字指针传递给getArray()函数时,你是传递它的值,假设数字指向一个随机值= 1234并且假设数字的地址是= 9999.现在当你调用getArray(数字)时,你告诉taht数字中的数字是否传递给getArray的数字变量我们放的是1234。

然后当你将内存分配给getArray()函数的局部变量的数字而不是主函数时,它可能有地址假设= 0x8888。然后malloc按指定的方式分配一些地址空间,并将分配的地址空间的起始地址(假设ie = 0x7777)存储到0x8888位,而不是0x9999,这是主要数字变量的地址。

因此当getArray函数结束并且下次调用sortArray时,你传递它的值仍然是垃圾1234的数字变量中存在的值。你应该传递的实际值出现在地址0x8888。

答案 2 :(得分:0)

另外,您可以使用C库函数qsort()为您执行排序工作。这是一个例子:

int main(void)
{
    int a[]={4,7,9,1,34,90,66,12};

    qsort(a, sizeof(a)/sizeof(a[0]), sizeof(int), compare);

    return 0;
}

int compare(const void *a, const void *b){
     const int *x = a, *y = b;
     if(*x > *y)
       return 1;
     else
       return(*x < *y) ? -1: 0;
}  

与动态分配的int数组或char数组一样工作