Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 链接在赋值时被卡住_C_Arrays_Malloc_Realloc - Fatal编程技术网

C 链接在赋值时被卡住

C 链接在赋值时被卡住,c,arrays,malloc,realloc,C,Arrays,Malloc,Realloc,我正在解决以下问题: 5.2递增任意精度的整数 编写一个程序,将编码非负十进制整数D的数字数组作为输入,并更新该数组以表示整数D+1。例如,如果输入为,则应将数组更新为。您的算法应该可以工作,即使它是用一种具有有限精度算法的语言实现的 我的策略是: 首先反转数组输入,以便更容易增加数组并考虑进位数 使用malloc将结果数字存储在动态分配的数组中。因此,如果结果中的位数超过了输入数组的容量,动态分配的数组可以使用realloc简单地扩展内存以包括最后一个进位数 反转动态分配的数组,使其处于正确的

我正在解决以下问题:

5.2递增任意精度的整数

编写一个程序,将编码非负十进制整数D的数字数组作为输入,并更新该数组以表示整数D+1。例如,如果输入为,则应将数组更新为。您的算法应该可以工作,即使它是用一种具有有限精度算法的语言实现的

我的策略是:

首先反转数组输入,以便更容易增加数组并考虑进位数

使用malloc将结果数字存储在动态分配的数组中。因此,如果结果中的位数超过了输入数组的容量,动态分配的数组可以使用realloc简单地扩展内存以包括最后一个进位数

反转动态分配的数组,使其处于正确的顺序

返回指向动态分配数组的第一个元素的指针

我只是想让链表存储一个int值:

代码如下:

#include <stdio.h>
#include <stdlib.h>
#include "Node.h"

void reverse (int * a, int len)
{
    for ( int i = 0, j = len - 1; i < j; i++, j--)
    {
        int temp = a[i];

        a[i] = a[j];

        a[j] = temp;

    }

}

int * inc_arr(int *a, int len)
{

    int result_len = 0;

    reverse(a,len); int * a_end = (a + len - 1);

    *a = *a + 1; int carry = *a/10; *a = *a%10; 

    Node * result = (Node *)malloc(sizeof(Node));

    Node * result_zero = result;

    result->value = *a; result = result->link; result_len++;

    while (a <= a_end)
    {
        if ( carry != 0)
        {
            result->value = (carry + *a)%10; 

            carry = (carry + *a)/10;
        }

        else
        { result->value = *a; carry = 0;}

        result = result->link; result_len++;

        a++;
    }

    if ( carry != 0)
    { 
        result->value = carry; result_len++;

        result->link = NULL;
    }

    else
    { result = NULL; }

    int a_final[result_len]; int *a_f = a_final;

    while (result_zero != NULL)
    {
        *a_f++ = (result_zero->value);

        result_zero = result_zero->link;
    }

    reverse(a_final,result_len);

    return a_final;

}


int main()
{
    int a[3] = {1,2,9};

    int * b = inc_arr(a,3);
}
调试器演示计算机拒绝超出此代码 无论我使用 调试器。这是什么原因?我最终得到了一个:


鱼:'./练习_5-2.o'由信号SIGSEGV(地址边界错误)终止

Node*result=malloc(sizeof(Node))后接
result=result->link
不会像你想象的那样工作。还要注意,
int a_final[result_len]
不是标准的C行为,但我猜你的编译器允许它。您是否在编译时启用了所有警告?当我这样做时,我至少得到了2或3,这是很有启发性的。而且,将结果存储在链表中与存储在数组中并不相同。@MichaelOrganger,此外,OP的
reverse()
函数不会进行双重交换,因为它的循环终止条件是
I
。好的,我在VLA点上让步了。我以为他们仍然是黑魔法。我也错过了
I
result->value = (carry + *a)%10;