当我使用gcc编译器运行下面的程序时,我遇到“细分错误:11”,但是当我在“ https://www.onlinegdb.com/online_c_compiler”上运行时,它执行得很好。我想知道,为什么gcc在这里抛出了分段错误?
#include <stdio.h>
int main(){
typedef int myArray[10];
myArray x = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29};//Equivalant to x[10]
myArray y[2]; //equivalant to y[10][2]
int counter = 0;
for(int i = 0; i < 10; i++){
for(int j = 0; j < 2; j++){
//printf("%i %i\n", i, j);
y[i][j] = counter++;
}
}
printf("\n\nElements in array x are\n");
for(int i = 0; i < 10; i++){
printf("x[%i] = %i\n", i, x[i]);
}
printf("\n\nElements in array y are\n");
for(int i = 0; i < 10; i++){
for(int j = 0; j < 2; j++){
printf("y[%i][%i] = %i\t", i, j, y[i][j]);
}
printf("\n");
}
return 0;
}
我正在使用gcc版本4.2.1。操作系统:MAC
$gcc --version
Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/usr/include/c++/4.2.1
Apple LLVM version 10.0.0 (clang-1000.10.44.4)
Target: x86_64-apple-darwin18.2.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
答案 0 :(得分:5)
这里的评论是错误的:
myArray y[2]; //equivalant to y[10][2]
y
实际上定义为:
int y[2][10];
即。 y
有2行,每行10个int
。
当您随后访问y[i][j]
时,行索引i
从0
到9
,列索引j
从0
到{{ 1}},每当1
(或i * ROW_SIZE + j
)大于或等于i * 10 + j
(或ROW_SIZE * ROW_CNT
)时,您最终将无法访问数组。
例如,10 * 2
尝试访问第十行的第二个值。但是y[9][1]
中只有2行。
Trying to access an array out of bounds has undefined behavior。 Undefined behavior意味着一切都可能发生,包括运行正常或崩溃。
要修复您的代码,请按以下说明定义y
(以使其与注释匹配):
y