Xcode __pthread_kill + 20
Xcode __pthread_kill + 20
我正在尝试 运行 具有大数组的简单命令行应用程序,如果我尝试遍历数组的 30 行,它会工作,但是当我将它增加到 1000 行时,它会崩溃,显示 (lldb)控制台。在线程 1 下,我有 __pthread_kill , __stack_chk_fail 。我的代码:
int main(int argc, const char * argv[]) {
int i;
int j;
int x;
int mains [2][50]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,
31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50};
int stars [2][11]={1,2,3,4,5,6,7,8,9,10,11};
int results [1000][7]={
{27,29,37,39,49,2,4}, //03.04.2015
{8,20,24,28,49,8,9},
// rest of array not relevant to the problem
{16,29,32,36,41,7,9},
};
for (i=0; i<1000; i++)
{
for (j=0; j<5; j++)
{
for (x=0; x<51; x++)
{
if (results[i][j]==mains[0][x])
{
mains[1][x]++;
}
}
}
}
for (i=0; i<1000; i++)
{
for (j=5; j<7; j++)
{
for (x=0; x<12; x++)
{
if (results[i][j]==stars[0][x])
{
stars[1][x]++;
}
}
}
}
for (i=0; i<49; i++) //array sorting
{
for (j=i+1; j<50; j++)
{
if (mains[1][i]>mains[1][j])
{
std::swap(mains[0][i],mains[0][j]);
std::swap(mains[1][i],mains[1][j]); }
}
}
for (i=0; i<10; i++) //array sorting
{
for (j=i+1; j<11; j++)
{
if (stars[1][i]>stars[1][j])
{
std::swap(stars[0][i],stars[0][j]);
std::swap(stars[1][i],stars[1][j]); }
}
}
printf("Mains Stars:\n\n");
for (i=0; i<5; i++)
{
printf("%d ",mains[0][i]);
}
for (i=0; i<2; i++)
{
printf("%d ",stars[0][i]);
}
return 0;
}
for (x=0; x<51; x++)
^^^^
{
if (results[i][j]==mains[0][x])
^^^
因此,x
从 0 到 50(含)。这意味着 mains[0]
必须有 51 个元素。
(如果你不明白为什么,想象一下如果 x
从 0 到 4
包括在内。这意味着你需要 5
个元素,0
, 1
、2
、3
和 4
。因此,如果从 0 迭代到 n
(含),则需要 n+1
个元素。)
int mains [2][50]={1,2,3,
^^
糟糕,只有 50 个。
当您增加局部变量的大小时,您 运行 出栈 space:
__stack_chk_fail -- terminate a function in case of stack overflow
我正在尝试 运行 具有大数组的简单命令行应用程序,如果我尝试遍历数组的 30 行,它会工作,但是当我将它增加到 1000 行时,它会崩溃,显示 (lldb)控制台。在线程 1 下,我有 __pthread_kill , __stack_chk_fail 。我的代码:
int main(int argc, const char * argv[]) {
int i;
int j;
int x;
int mains [2][50]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,
31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50};
int stars [2][11]={1,2,3,4,5,6,7,8,9,10,11};
int results [1000][7]={
{27,29,37,39,49,2,4}, //03.04.2015
{8,20,24,28,49,8,9},
// rest of array not relevant to the problem
{16,29,32,36,41,7,9},
};
for (i=0; i<1000; i++)
{
for (j=0; j<5; j++)
{
for (x=0; x<51; x++)
{
if (results[i][j]==mains[0][x])
{
mains[1][x]++;
}
}
}
}
for (i=0; i<1000; i++)
{
for (j=5; j<7; j++)
{
for (x=0; x<12; x++)
{
if (results[i][j]==stars[0][x])
{
stars[1][x]++;
}
}
}
}
for (i=0; i<49; i++) //array sorting
{
for (j=i+1; j<50; j++)
{
if (mains[1][i]>mains[1][j])
{
std::swap(mains[0][i],mains[0][j]);
std::swap(mains[1][i],mains[1][j]); }
}
}
for (i=0; i<10; i++) //array sorting
{
for (j=i+1; j<11; j++)
{
if (stars[1][i]>stars[1][j])
{
std::swap(stars[0][i],stars[0][j]);
std::swap(stars[1][i],stars[1][j]); }
}
}
printf("Mains Stars:\n\n");
for (i=0; i<5; i++)
{
printf("%d ",mains[0][i]);
}
for (i=0; i<2; i++)
{
printf("%d ",stars[0][i]);
}
return 0;
}
for (x=0; x<51; x++)
^^^^
{
if (results[i][j]==mains[0][x])
^^^
因此,x
从 0 到 50(含)。这意味着 mains[0]
必须有 51 个元素。
(如果你不明白为什么,想象一下如果 x
从 0 到 4
包括在内。这意味着你需要 5
个元素,0
, 1
、2
、3
和 4
。因此,如果从 0 迭代到 n
(含),则需要 n+1
个元素。)
int mains [2][50]={1,2,3,
^^
糟糕,只有 50 个。
当您增加局部变量的大小时,您 运行 出栈 space:
__stack_chk_fail -- terminate a function in case of stack overflow