gpt4 book ai didi

c - 如何使用 Collat​​z 猜想函数在 C 中返回 int 数组?

转载 作者:行者123 更新时间:2023-11-30 16:41:19 25 4
gpt4 key购买 nike

我有一个用于 Collat​​z 猜想的函数,它返回一个 int 数组,但我不断收到段错误错误,但不确定原因。

int n=1;  

int* col fuction(int x){
int *totalList;

totalList[0]=x;

while (x != 1){
if (x%2==0){
x=x/2;
}else{
x= 3* x + 1;
}

totalList[n]= x;
n++;
}
totalList[n+1]=1;
return totalList;
}

它应该返回一行中的整数,每个数字之间用逗号分隔。我称之为如下所示:

    int *colAns;
colAns= col(num);
for (int k =0; k< n; k++){
printf("%d", colAns[k]);
if(colAns[k] != 1){
printf(",");
}
}
printf("\n");

最佳答案

您的问题出在 col_function() 的前几行。

int* col_fuction(int x){
int *totalList;

totalList[0]=x;
// ...
}

当在堆栈上创建名为 totalListint* 时,它将采用之前存在的任何值。指针值很可能是进程所拥有的任何东西,更不用说有效/可用的东西了。

您需要的是一个动态分配的值,该值可以随着值的添加而增长。为此,我们使用malloc来分配预先确定的内存量。因为 collat​​z 函数是递归的,并且元素的数量不能仅通过查看它来确定,所以我们不能假设确切地知道它将占用多少内存,因此它应该随着数字的添加而增长。为此,我们使用reallocrealloc 的优点在于,如果第一个参数为 NULL,标准保证它像 malloc 一样工作。

您真正需要的唯一其他东西是结构内部的几个 size_t 值,以便跟踪当前索引以及分配的空间。像这样的东西应该足够了:

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

#define CHUNK_SIZE 100

typedef struct dynarray
{
int *values;
size_t allocated, used;
} dynarray;

int dynarray_init(dynarray *d)
{
memset(d, 0, sizeof(dynarray));
return 0;
}

int dynarray_deinit(dynarray *d)
{
free(d->values);
memset(d, 0, sizeof(dynarray));
return 0;
}

int dynarray_append(dynarray *d, int val)
{
int *tmp = NULL;
size_t i;
if(d->used + 1 >= d->allocated)
{
if((tmp = (int*)realloc(d->values, (d->allocated + CHUNK_SIZE)*sizeof(int))) == NULL)
{
perror("realloc() failure");
return 1;
}
else
{
d->values = tmp;
d->allocated += CHUNK_SIZE;
}
}
d->values[d->used++] = val;
}

在初始化后,使用 dynarray_append() 将值添加到列表中。

关于c - 如何使用 Collat​​z 猜想函数在 C 中返回 int 数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46290638/

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