gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:29:49 26 4
gpt4 key购买 nike

我正在尝试编写一个为数组动态分配内存的程序,然后用户用整数值填充数组,程序对所述整数值进行排序。但是,我的阵列似乎没有按预期工作。我已经设法让程序使用静态数组,但是动态分配给我带来了很多错误值等问题。这是我到目前为止动态分配版本的内容(如果对你们有帮助,我还可以提供使用静态数组的版本):

#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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com