当我输入“1073741824”时,它返回“分段故障”。
“1073741824”是4294967296÷4,即(INT_MAX + 1)÷(sizeof(char *))。
并且,这是此代码中的malloc()参数。
但我不知道如何缓解这个问题。
请帮帮我。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <limits.h>
int main(int argc, char **argv)
{
int val, i;
char *mem;
if (argc < 2)
exit(1);
val = atoi(argv[1]);
if (val > 0) {
mem = malloc(val * sizeof(char *));
if (mem == NULL) {
printf("Failure\n");
exit(2);
}
}
for (i = 0; i < val; i++) {
mem[i] = 'A';
printf("%c", mem[i]);
}
printf("\n");
return 0;
}
答案 0 :(得分:2)
可能在您的C实现中,C:\rakudo\bin\lib>perl6 -v
This is Rakudo Star version 2018.04.1 built on MoarVM version 2018.04.1
implementing Perl 6.c.
C:\rakudo\bin\lib>perl6-debug-m
←[35m>>> LOADING ←[0m<REPL 1>
←[34m+ <REPL 1> (1 - 1)←[0m
←[34m| ←[0m←[1;33mREPL←[0m
←[34m> ←[0mquit
←[34m- ←[0mRun END blocks (y/N)?
C:\rakudo\bin\lib>perl6 -V |grep -v "moar:"
distro::auth=unknown
distro::desc=2018-05-20T09:17:12.587605-04:00
distro::is-win=True
distro::name=mswin32
distro::path-sep=;
distro::release=unknown
distro::signature=
distro::version=6.3
kernel::arch=unknown
kernel::archname=unknown-win32
kernel::auth=unknown
kernel::bits=64
kernel::desc=
kernel::hardware=unknown
kernel::name=win32
kernel::release=unknown
kernel::signature=
kernel::version=unknown
perl6::build-date=2018-05-07T10:08:20Z
perl6::codename=
perl6::implementation=Rakudo Star
perl6::language_version=6.c
perl6::libdir=C:\rakudo\share
perl6::prefix=C:\rakudo
perl6::release-number=
perl6::source-digest=688d0872d150048d083b7a499e9fc7a9e8b6ab5b
perl6::version=2018.04.1
repo::chain=inst#C:\Users\danhale\.perl6 inst#C:\rakudo\share\perl6\site inst#C:\rakudo\share\perl6\vendor inst#C:\rakudo\share\perl6 ap# nqp# perl5#
,int
和size_t
各为32位,四个字节。当char *
为1073741824时,val
溢出,并且当它发生时,产生零。然后val * sizeof(char *)
分配零字节的内存。它返回一个指向零字节的有效指针,而不是NULL,因此对NULL的测试不会导致程序退出。
然后程序尝试将1073741824字节写入分配的内存。由于分配了零字节,它会超出空间并崩溃。
mem = malloc(val * sizeof(char *));
应为mem = malloc(val * sizeof(char *));
或更好,mem = malloc(val * sizeof(char));
。