C语言中的基本数组用法?

| 这就是你们在ANSI-C99中获得数组大小的方式吗?似乎有点笨拙,来自高级语言。
int tests[7];
for (int i=0; i<sizeof(tests)/sizeof(int); i++) {
    tests[i] = rand();
}
同样,此分割错误。
int r = 10000000;
printf (\"r: %i\\n\", r);
int tests[r];
运行:
r: 10000000
Segmentation fault
10000000段故障,但100万有效。 我如何从中获得更多信息?我应该检查什么,如何调试这样的东西? C数组有限制吗?什么是细分错误?
已邀请:
C语言中的数组不知道它们有多大,所以是的,您必须执行
sizeof array / sizeof array[0]
技巧才能获取数组中的元素数。 至于段错误问题,我猜测您尝试分配10000000 * 4个字节超出了堆栈大小。一条经验法则是,如果您需要数百个以上的字节,请使用
malloc
calloc
动态分配它,而不是尝试创建较大的
auto
变量:
int r = 10000000;
int *tests = malloc(sizeof *test * r);
请注意,在大多数情况下,您可以将ѭ9视为数组类型(即您可以对其下标,可以将其传递给需要数组的任何函数,等等),但是它不是数组类型;它是一种指针类型,因此
sizeof tests / sizeof tests[0]
技巧将不起作用。
在C中获取数组的大小很容易。这将为您提供以字节为单位的数组大小。
sizeof(x)
但是我想您需要的是元素数量,在这种情况下,它将是:
sizeof(x) / sizeof(x[0])
您可以为此编写一个简单的宏:
#define NumElements(x)  (sizeof(x) / sizeof(x[0]))
例如:
int a[10];
int size_a = sizeof(a); /* size in bytes */
int numElm = NumElements(a); /* number of elements, here 10 */
为什么要计算尺寸? 定义一个包含大小的常量,并在声明数组时使用该常量。每当需要数组的大小时,都引用常量。 作为一个主要的C ++程序员,我会说,从历史上讲,常量经常被定义为枚举值或#define。在C语言中,这可能是当前的,而不是历史性的-我不知道当前的C如何处理“ const”。 如果您确实要计算大小,请定义一个宏来执行。甚至可能有一个标准的。 发生段错误的原因很可能是因为您要声明的数组的值约为40 MB,并被声明为局部变量。大多数操作系统都会限制堆栈的大小。将您的阵列保留在堆中或全局内存中,并且对于大多数系统来说,一个变量使用40兆字节可能就可以了,尽管某些嵌入式系统可能仍然会犯规。在Java之类的语言中,所有对象都在堆上,而只有引用保留在堆栈上。这是一个简单而灵活的系统,但是效率通常比在堆栈上存储数据要低得多(堆分配开销,可避免的堆碎片,间接访问开销...)。
传统上,数组具有静态大小。所以我们可以做
#define LEN 10
int arr[LEN];
但不是
int len;
scanf(\"%d\", &len);
int arr[len]; // bad!
由于我们在编译时就知道数组的大小,因此获取数组的大小往往是微不足道的。我们不需要
sizeof
,因为我们可以通过查看声明来确定尺寸。 C ++提供了堆数组,如
int len;
scanf(\"%d\", &len);
int *arr = new int[len];
但是由于这涉及指针而不是堆栈数组,因此我们必须将大小存储在我们手动传递的变量中。
我怀疑这是因为整数溢出。尝试使用printf打印值:
printf(\"%d\", 10000000);
如果打印出负数-这就是问题所在。
堆栈溢出!尝试在堆而不是堆栈上进行分配。

要回复问题请先登录注册