【发布时间】:2021-07-22 14:11:30
【问题描述】:
我的任务是用 C 编写一个程序。该程序应该能够检查参数并创建与我提供的参数一样大的数组。我必须用随机数填充数组。到目前为止工作正常。后来我的任务是使用指针对数组进行排序。第一件事是我不太明白指针是如何工作的,但到目前为止我已经完成了排序工作。唯一的问题是,我只能排序到 4 的大小。如果我的参数大于 4,我会排序前 4 个数字,然后是分段错误。我找不到问题,但有趣的是,如果我添加一个 printf 只是为了再次打印我的参数,它适用于我想要的任何参数!不知道怎么回事!
这里又是确切的任务,因为我觉得我描述得不太好:
为此,创建一个相同大小的动态指针字段,并使用指向 int 字段元素的指针对其进行初始化。排序时,现在应该对指针进行排序,以便第一个指针指向最小的 int 值,第二个指向下一个最大值,依此类推。
int main(int argc, char *argv[]) {
int *array;
int **arrpointer;
int size = atoi(argv[1]);
if (size == 0) {
fprintf(stderr, "Wrong parameter!\n");
return EXIT_FAILURE;
}
//printf("Array-Size : "); //First I had it with scanf, which works perfectly fine without a print
//scanf("%d", &size);
printf("Input%d", size); //This is the print I need somehow!
// allocate memory
array = (int *)malloc(size * sizeof(int)); // Init Array
arrpointer = (int **)malloc(size * sizeof(int)); // Init Pointer Array
//Check Pointer array
if (arrpointer != NULL) {
printf("Memory allocated\n\n");
} else {
fprintf(stderr, "\nNo free memory.\n");
return EXIT_FAILURE;
}
if (array != NULL) {
printf("Memory is allocated\n\n");
//Fill Array
for (int i = 0; i < size; i++) {
array[i] = rand() % 1000; //I know it is not random right now, will add later
int *temp = &array[i];
arrpointer[i] = temp; //Pointer fill
}
} else {
fprintf(stderr, "\nNo free memory to allocate.\n");
return EXIT_FAILURE;
}
shakersort(arrpointer, size); //Function to sort pointers
zeigeFeld(arrpointer, size); //Function to Print
free(array);
free(arrpointer);
return EXIT_SUCCESS;
}
我知道这有点令人困惑,我很抱歉。 我还将在下面排序的地方添加代码。
void swap(int **a, int **b) {
int ram;
ram = **a;
**a = **b;
**b = ram;
}
void shakersort(int **a, int n) {
int p, i;
for (p = 1; p <= n / 2; p++) {
for (i = p - 1; i < n - p; i++)
if (*a[i] > *a[i+1]) {
swap(&a[i], &a[i + 1]);
}
for (i = n - p - 1; i >= p; i--)
if (*a[i] < *a[i-1]) {
swap(&a[i], &a[i - 1]);
}
}
}
这是我尝试为指针构建的代码,到目前为止它运行良好。
我希望有人可以帮助或提供一些意见,说明我的打印解决问题的原因。我真的不明白! 感谢您的时间和帮助,如果我应该添加任何内容,请告诉我!
【问题讨论】:
-
我想到了两件事:首先,
arrpointer应该用arrpointer = (int **) malloc(size * sizeof(int*));初始化。您应该使用 int 指针的大小,而不是 int 的大小。其次,据我了解,您的任务不是对实际的 int 数组进行排序(您要做什么),而是对 pointer arrary 进行排序,以使原始 int 数组保持不变,但指针您的arrpointer已排序。 -
另外,您应该再次查看您发布的 sn-ps:在第一个中,最后一个大括号应该在
return EXIT_FAILURE;之后,而不是在 and。在第二个中,您的交换方法的签名丢失了。如果你纠正了这个会更容易理解:) -
@Kebberling Instead 的不需要的演员和潜在的类型不匹配,
arrpointer = malloc(sizeof *arrpointer * size);更容易正确编码、审查和维护。 -
你是对的,不知道那个语法
-
@snakezz
array = (int *) malloc(size * sizeof(int));今天还可以,但比array = malloc(sizeof *array * size);更难审查。以后如果代码变成long long *array,sizeof(int)就会出错。使用array = malloc(sizeof *array * size);是正确的今天和该类型更新之后。array = (int *) malloc(size * sizeof(int));是 WET。
标签: c pointers segmentation-fault