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