C,在终端执行时出现错误“;死亡人数:9“;

C,在终端执行时出现错误“;死亡人数:9“;,c,C,我知道我做这门课的方式很枯燥,但明天就要交了,所以我现在只能坚持这样做,因为我没有太多时间去想另一个。这段代码的作用是:取一个10位数字,将其分成10位,检查从1到这个数字的所有可能性,如果10位数字之和等于37,如果是,则增加一个计数器,给出这些数字加起来的数字总数为37。问题是这么大的数字,我猜内存分配有问题,当我在macOS终端上运行它时,会出现错误“Killed:9”(经过一段时间的ofc) 以下是我的源代码(C语言): #包括 #包括 int main() { long long*co

我知道我做这门课的方式很枯燥,但明天就要交了,所以我现在只能坚持这样做,因为我没有太多时间去想另一个。这段代码的作用是:取一个10位数字,将其分成10位,检查从1到这个数字的所有可能性,如果10位数字之和等于37,如果是,则增加一个计数器,给出这些数字加起来的数字总数为37。问题是这么大的数字,我猜内存分配有问题,当我在macOS终端上运行它时,会出现错误“Killed:9”(经过一段时间的ofc) 以下是我的源代码(C语言):

#包括
#包括
int main()
{
long long*counter=malloc(9999999999*sizeof(*counter));//数组的大小应最大为9999999999
long long counter2=1;//由于计数器2最多为10位,所以很长,最大为99999999
整数第一位数、第二位数、第三位数、第四位数、第五位数、第六位数、第七位数、第八位数、第九位数、第十位数;
无符号长z2,z3,c,z1,z4,z5,z6,z7;//最多9位
无符号长计数=0;//最多9位
对于(长i=1;此后i)

long long *counter = malloc(9999999999 * sizeof(*counter));

您将看到它返回0,因为您的系统无法分配那么多内存,现在当您尝试写入该地址时,您将收到segfault。在此之后,请始终检查
malloc
s的返回代码。

long long *counter = malloc(9999999999 * sizeof(*counter));


您将看到它返回0,因为您的系统无法分配那么多内存,现在当您尝试写入该地址时,您将得到一个segfault。请始终检查
malloc
s的返回代码。

问题是为您的应用程序保留几GB内存可能会失败,如
cou中所示nter
将是
NULL
。如果(counter==NULL){printf(“无法分配内存”);返回1;}
,您可以通过编写
轻松检查这一点。如果不检查这一点,您将访问不允许访问的内存,产生未定义的行为,通常会产生segfaults

顺便说一句:为了只计算数字的和,您不需要在内存中实际存储所有要检查的数字。因此,不需要完整的
计数器
-数组。删除
malloc
,并将
计数器[i]
替换为循环中的
i

for (long long i = 1 ; i<9999999999 ; i++) 
{
    FirstDigit = i / 1000000000; 

    z1= i / 100000000;
    secondDigit = z1 % 10;

    ...
}

for(long long i=1;i问题是为应用程序保留几GB的内存可能会失败,这表明
计数器
将为
NULL
。如果(counter==NULL){printf(“无法分配内存”);返回1;},您可以通过编写
轻松检查这一点
。如果不检查此项,您将访问不允许访问的内存,产生未定义的行为,通常会产生错误

顺便说一句:为了只计算数字的和,您不需要在内存中实际存储所有要检查的数字。因此,不需要完整的
计数器
-数组。删除
malloc
,并将
计数器[i]
替换为循环中的
i

for (long long i = 1 ; i<9999999999 ; i++) 
{
    FirstDigit = i / 1000000000; 

    z1= i / 100000000;
    secondDigit = z1 % 10;

    ...
}

for(long long i=1;i通过检查
malloc()的返回值启动。
malloc(99999999999*sizeof(*counter));
malloc(99999999999999*sizeof(*counter))为什么需要分配这么大的内存块这对我来说是个危险信号。你需要至少74 GB的内存。你确定你的机器有那么多的物理内存,并且你的操作系统已经准备好分配它了吗?
9
是一个
SIGSEGV
的代码,也就是所谓的segfault。在某个地方,你正在向未初始化的内存或类似的内存写入或读取。是的-为什么要全部存储?我会对数字进行字符串化,对每个字符重复输入字符,每次输入字符'0',添加,检查是否>36,如果是,则断开,最后检查37,如果相等,则增加计数。无需存储所有字符。首先检查
malloc()
的返回值。为什么需要分配这么大的内存
malloc>(99999999999*sizeof(*计数器));
malloc(99999999999*sizeof(*计数器))这对我来说是个危险信号。你需要至少74 GB的内存。你确定你的机器有那么多的物理内存,并且你的操作系统已经准备好分配它了吗?
9
是一个
SIGSEGV
的代码,也就是所谓的segfault。在某个地方,你正在向未初始化的内存或类似的内存写入或读取。是的-为什么要全部存储?我会对数字进行字符串化,对每个字符重复输入字符,每次输入字符'0',添加,检查是否>36,如果是,则中断,最后检查37,如果相等,则增加计数。无需存储所有字符。
NULL
时发生的行为由
%p
打印。我建议e> 如果(counter==NULL){printf(“分配计数器失败\n”);}
在我的系统上,它会打印0,但这是一个很好的观点。我只是想大声证明
malloc
确实失败了。一些实现打印
(NULL)
在使用空指针的情况下。OP可能会混淆,仅此而已。使用
%p
打印
null
时发生的行为是实现定义的。我建议
如果(计数器==null){printf(“计数器分配失败\n”);}
在我的系统上它打印0,但这是一个很好的观点。我只是想大声证明
malloc
确实失败了。一些实现在出现空指针的情况下打印
(null)
。OP可能会混淆,仅此而已。