gpt4 book ai didi

C 分配 500 个或更多长的数组

转载 作者:行者123 更新时间:2023-12-04 04:32:07 25 4
gpt4 key购买 nike

所以..我有这样的东西。它应该创建具有 10、20、50 100 .. 最多 5000 个随机数的数组,然后使用插入排序进行排序并打印出进行了多少比较和交换。但是,当我达到 200 时,我遇到了运行时异常数字大数组..“访问冲突写入位置0x00B60000。” .. 有时我什至没有达到 200 并在 10 个数字后立即停止。我真的不知道。

long *arrayIn;
int *swap_count = (int*)malloc(sizeof(int)), *compare_count = (int*)malloc(sizeof(int));
compare_count = 0;
swap_count = 0;
int i, j;
for (j = 10; j <= 1000; j*=10) {
for (i = 1; i <= 5; i++){
if (i == 1 || i == 2 || i == 5) {
int n = i * j;
arrayIn = malloc(sizeof(long)*n);
fill_array(&arrayIn, n);
InsertionSort(&arrayIn, n, &swap_count, &compare_count);
print_array(&arrayIn, n, &swap_count, &compare_count);
compare_count = 0;
swap_count = 0;
free(arrayIn);
}
}
}

编辑:这个 free(arrayIn);我得到这个“堆栈 cookie 检测代码检测到基于堆栈的缓冲区溢出。”我一无所获。但是,如果没有它,它“只是”“访问冲突写入位置 0x00780000”。但我最终得到了 200 个数字
void fill_array(int *arr, int n) {
int i;
for (i = 0; i < n; i++) {
arr[i] = (RAND_MAX + 1)*rand() + rand();
}
}

void InsertionSort(int *arr, int n, int *swap_count, int *compare_count) {
int i, j, t;
for (j = 0; j < n; j++) {
(*compare_count)++;
t = arr[j];
i = j - 1;
*swap_count = *swap_count + 2;
while (i >= 0 && arr[i]>t) { //tady chybí compare_count inkrementace
*compare_count = *compare_count + 2;
arr[i + 1] = arr[i];
(*swap_count)++;
i--;
(*swap_count)++;
}
arr[i + 1] = t;
(*swap_count)++;
}
}

最佳答案

我相信你的编译器告诉你出了什么问题。

您正在传递 long**到一个需要 int* 的函数在线

fill_array(&arrayIn, n);

函数原型(prototype)是
void fill_array(int *arr, int n)

其他功能也有同样的问题。从那里,任何事情都可能发生。

始终,始终注意编译器给您的警告。

主要编辑

首先 - 是的,数组的名称已经是一个指针。

第二 - 在代码开头声明一个函数原型(prototype);然后编译器会向你抛出有用的消息,这将帮助你捕获这些

第三 - 如果您想将简单变量的地址传递给函数,则不需要 malloc ;只需使用变量的地址。

第四—— rand()函数返回一个介于 0 和 RAND_MAX 之间的整数.编码
a[i] = (RAND_MAX + 1) * rand() + rand();

是一种迂回的获得方式
a[i] = rand();

自从 (RAND_MAX + 1)将溢出并给你零......如果你真的想要能够获得一个“非常大”的随机数,你必须执行以下操作:

1) 确保 along * (使用正确的原型(prototype)等)

2)在加/乘之前转换数字:
a[i] = (RAND_MAX + 1L) * rand() + rand();

可能会这样做 - 或者您可能需要对 (long) 进行更多转换;我永远记不起我的优先顺序,所以我通常会这样做
a[i] = ((long)(RAND_MAX) + 1L) * (long)rand() + (long)rand();

100% 确定。

将这些和其他类(class)放在一起,这是您的代码的编辑版本,可以编译和运行(我确实必须“发明”一个 print_array ) - 我已经写了需要更改代码才能工作的注释。上面的最后一点(制作长随机数)尚未在此代码中考虑。
#include <stdio.h>
#include <stdlib.h>

// include prototypes - it helps the compiler flag errors:
void fill_array(int *arr, int n);
void InsertionSort(int *arr, int n, int *swap_count, int *compare_count);
void print_array(int *arr, int n, int *swap_count, int *compare_count);

int main(void) {

// change data type to match function
int *arrayIn;

// instead of mallocing, use a fixed location:
int swap_count, compare_count;

// often a good idea to give your pointers a _p name:
int *swap_count_p = &swap_count;
int *compare_count_p = &compare_count;

// the pointer must not be set to zero: it's the CONTENTs that you set to zero
*compare_count_p = 0;
*swap_count_p = 0;

int i, j;
for (j = 10; j <= 1000; j*=10) {
for (i = 1; i <= 5; i++){
if (i == 1 || i == 2 || i == 5) {
int n = i * j;
arrayIn = malloc(sizeof(long)*n);
fill_array(arrayIn, n);
InsertionSort(arrayIn, n, swap_count_p, compare_count_p);
print_array(arrayIn, n, swap_count_p, compare_count_p);
swap_count = 0;
compare_count = 0;
free(arrayIn);
}
}
}
return 0;
}

void fill_array(int *arr, int n) {
int i;
for (i = 0; i < n; i++) {
// arr[i] = (RAND_MAX + 1)*rand() + rand(); // causes integer overflow
arr[i] = rand();
}
}

void InsertionSort(int *arr, int n, int *swap_count, int *compare_count) {
int i, j, t;
for (j = 0; j < n; j++) {
(*compare_count)++;
t = arr[j];
i = j - 1;
*swap_count = *swap_count + 2;
while (i >= 0 && arr[i]>t) { //tady chybí compare_count inkrementace
*compare_count = *compare_count + 2;
arr[i + 1] = arr[i];
(*swap_count)++;
i--;
(*swap_count)++;
}
arr[i + 1] = t;
(*swap_count)++;
}
}

void print_array(int *a, int n, int* sw, int *cc) {
int ii;
for(ii = 0; ii < n; ii++) {
if(ii%20 == 0) printf("\n");
printf("%d ", a[ii]);
}
printf("\n\nThis took %d swaps and %d comparisons\n\n", *sw, *cc);
}

关于C 分配 500 个或更多长的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20435165/

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