【问题标题】:How to return int array in C using this Collatz Conjecture function?如何使用这个 Collat​​z Conjecture 函数在 C 中返回 int 数组?
【发布时间】:2017-09-19 01:55:45
【问题描述】:

我有一个用于 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");

【问题讨论】:

  • totalList[0] = x 使用未初始化的指针 totalList 运行。
  • 另一方面,您应该使用-Wall-Wextra 打开编译器警告,因为它们应该能够警告您尝试取消引用未初始化指针的此类问题。
  • 使用malloctotalList分配内存。

标签: c arrays function pointers


【解决方案1】:

您的问题在于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()向列表添加值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    • 2021-03-29
    • 1970-01-01
    • 1970-01-01
    • 2013-03-10
    相关资源
    最近更新 更多