使用 `struct S { const char *array[ARG_MAX]; 避免 `struct S as[] = {{NULL}};` 的段错误; };`?
Avoid segfault from `struct S as[] = {{NULL}};` with `struct S { const char *array[ARG_MAX]; };`?
在具有 gcc -ansi
的 Apple clang 版本 12.0.5 (clang-1205.0.22.11) 上,以下会产生段错误:
#include <stdlib.h>
#define ARG_MAX 1024 * 1024
struct S { const char *array[ARG_MAX]; };
int main(void) {
struct S as[] = {{NULL}};
return EXIT_SUCCESS;
}
ARG_MAX
在 sys/syslimits.h
中定义为 1024 * 1024
,上面已明确定义。
如何避免段错误?
在大多数实现中应避免使用具有自动存储持续时间的大型数组(也称为局部变量),因为它们通常使用大小固定且相当有限的堆栈,例如在 1-8 MB 范围内。如果对象大小超过可用堆栈,则可能会发生各种情况。包括段错误。
How do I avoid the segfault?
像这样使用动态分配:
#define ARG_MAX (1024 * 1024)
struct S { const char *array[ARG_MAX]; };
int main(void) {
struct S * as = calloc(1, sizeof *as);
if (as == NULL) exit(EXIT_FAILURE);
... use as[0] ...
free(as);
return EXIT_SUCCESS;
}
大多数实现都有更多内存可用于动态分配的对象。它通常称为堆内存。
顺便说一句:您的代码使用单个元素创建数组是合法的,但有点奇怪。
在具有 gcc -ansi
的 Apple clang 版本 12.0.5 (clang-1205.0.22.11) 上,以下会产生段错误:
#include <stdlib.h>
#define ARG_MAX 1024 * 1024
struct S { const char *array[ARG_MAX]; };
int main(void) {
struct S as[] = {{NULL}};
return EXIT_SUCCESS;
}
ARG_MAX
在 sys/syslimits.h
中定义为 1024 * 1024
,上面已明确定义。
如何避免段错误?
在大多数实现中应避免使用具有自动存储持续时间的大型数组(也称为局部变量),因为它们通常使用大小固定且相当有限的堆栈,例如在 1-8 MB 范围内。如果对象大小超过可用堆栈,则可能会发生各种情况。包括段错误。
How do I avoid the segfault?
像这样使用动态分配:
#define ARG_MAX (1024 * 1024)
struct S { const char *array[ARG_MAX]; };
int main(void) {
struct S * as = calloc(1, sizeof *as);
if (as == NULL) exit(EXIT_FAILURE);
... use as[0] ...
free(as);
return EXIT_SUCCESS;
}
大多数实现都有更多内存可用于动态分配的对象。它通常称为堆内存。
顺便说一句:您的代码使用单个元素创建数组是合法的,但有点奇怪。