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

标签 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;
}    

最佳答案

这是一个可行的解决方案:

#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 *numbers 时,问题在于您的 main 中,数字指针指向一些垃圾内存位置,因为局部变量可以具有任何垃圾值,因此当您将此数字指针传递给 getArray() 函数时,您是传递它的值,假设数字指向某个随机值 = 1234 并假设数字的地址 = 9999。 现在,当您调用 getArray(numbers) 时,您告诉 taht 数字中的任何内容将其传递给 getArray 的数字变量,我们让其为1234.

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

因此,当 getArray 函数结束时,下次调用 sortArray 时,您将传递给 main 的数字变量中存在的值,该值仍然是垃圾 1234。而您应该传递的实际值存在于地址 0x8888 处。

关于c - 使用指针作为动态分配的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25489799/

相关文章:

c - 如果我尝试在 C 中将一个数组复制到另一个数组中,则会出现错误消息

arrays - Swift - 从文件读取/写入数组数组

c - 释放 C 中的 2D 数组。 "double free or corruption"和 "invalid next size"

embedded - 如何更改 FreeRTOS 中任务的最大可用堆大小?

c - C 中与指针的奇怪交互

c - libevent 是否同时处理两个事件,这意味着我需要互斥锁?

c - 原子写入文件描述符

C语言计算2的最高次幂整除一个数

c - 如何在 C 中对 'æ' 、 'ø' 和 'å' 进行操作

c - 为什么这需要 malloc'd?