局部和全局数组以及分段错误

问题描述

我在以下方面遇到麻烦:我想取一个大数(大约15位数字)并将其转换为单个数字并将其存储在数组中。我将在代码中进一步使用这些数字。问题是,如果我在while循环外声明该数组,它将存储前四个值,但随后出现分段错误。如果我在循环中声明它,那么代码将按我希望的那样工作,但是然后我不知道如何将数组移出该循环,因此我无法进一步使用它。我该如何解决?这是我编译的:

unsigned long long card_num;
printf("Enter your credit card number:\n");
scanf("%llu",&card_num);
int count = 0;
    
while (card_num != 0)
{
   int digits[count]; //declaring array into which digits will be stored
   digits[count] = card_num%10; // get last digit,store it in array
   card_num = card_num/10; //remove last digit
   printf("Digit[%i] = %i\n",count,digits[count]);
   printf("Number of digits: %i\n",count);
   count ++;
}

解决方法

在您的代码中,第一次迭代

 int digits[count]; 

count0,这违反了规范中提到的约束。根据{{​​1}},第6.7.5.2章,

除了可选的类型限定符和关键字C11外,static[还可以分隔表达式或]。如果它们定界表达式(指定数组的大小),则该表达式应具有整数类型。如果表达式是一个常量表达式,则其值应大于零。 [....]

如果size是一个不是整数常量表达式的表达式:如果它出现在函数原型范围的声明中,则将其视为由*替换;否则,每次对其进行评估时,其值都应大于零

所以,这不是有效的代码。

,

如前所述,您在做什么是完全错误的。
有几种方法可以解决此问题。最简单的方法是在程序的开头分配一个数组,为所有用例分配足够的空间,例如:

#define MAX_DIGIT 50
int digits[MAX_DIGIT];

然后,您只需检查count < MAX_DIGIT,即可检查自己是否没有遍历此数组。

另一种方法是,一旦知道所需数组的大小,就可以使用int指针int *digitsmalloc(我让你用谷歌搜索)来进行动态内存分配。在开始获取数字之前,您必须稍稍更改代码以了解数字的数量,因为在开始存储数字之前需要分配内存。
您可以使用realloc来保持与现有代码相似的代码,但是我不建议您这样做,因为为您添加的每个值重新分配内存效率不高。

,

您的逻辑很好。

出问题的是,您尝试在迭代的同时尝试增加定长数组的长度

您应该从不在程序中的任何位置更改固定长度数组的长度。

但是,如果要在运行时更改数组的长度,则必须使用 malloc realloc 函数。

查看此示例

//declarations
int *storeNum;
storeNum = (int *)malloc(1 * sizeof(int));

//logic
while(num != 0) {
    if(i > 0) 
       storeNum = realloc(storeNum,(i+1) * sizeof(int));
    storeNum[i] = num % 10;
    num = num/10;
    ++i;
}

首先,我首先声明数组大小为1,然后使用 realloc 函数将其递增

您还将数组大小存储在 i 中,以后可以在循环代码中使用。

但是请记住,这些数字将以相反的顺序存储在您的数组中。

此外,您不应在循环中声明数组

由于您已经“声明”了数组,因此每次编译器在迭代时进入循环时,都会将数组声明视为新数组。就是这样。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...