读书人

C 提示段异常

发布时间: 2013-04-20 19:43:01 作者: rapoo

C 提示段错误

#include <stdio.h>
#define MAXCOUNT 10
#define MAXWIDTH 10
#define HAS 1
#define BLANK 0
int main()
{
int wdlth[MAXCOUNT + 1];
int i, j, k, n, c = 0, charcount = 0, maxvalue = 0;
for (i = 0; i <= (MAXCOUNT - 1); ++i)
wdlth[i] = 0;
//遍历
while ((c = getchar()) != '\n') {
if (c == ' ' || c =='\t' || c == '.' || c == ',') {
if (charcount != 0) {
if (charcount <= MAXCOUNT) {
++wdlth[charcount - 1];
charcount = 0;
} else {
++wdlth[MAXCOUNT];
charcount = 0;
}
}
} else
++charcount;
}

//取最大值
for (i = 0; i <= MAXCOUNT; ++i) {
if (wdlth[i] > maxvalue)
maxvalue = wdlth[i];
}
printf("aaa%d---%d", maxvalue, MAXCOUNT);
//构造数组[单词数][字母数]、初始化并赋值

int position[maxvalue + 1][MAXCOUNT + 1];

for (j = 0; j <= (maxvalue + 1); j++) {
for (k = 0; k <= (MAXCOUNT + 1); k++) {
position[j][k] = BLANK;
}
}


for (j = (maxvalue - 1); j >= 0; --j) {
for (k = 0; k <= MAXCOUNT; ++k) {
if (wdlth[k] > j)
position[j][k] = HAS;
else


position[j][k] = BLANK;
}
}
//输出
printf("单词\n个数\n");
for (j = (maxvalue); j >= 0; --j) {
printf("%2d|", j + 1);
for (k = 0; k <= MAXCOUNT; ++k) {
if (position[j][k] == HAS)
printf(" *");
else if (j != 0 && position[j - 1][k] == HAS)
printf("%3d", wdlth[k]);
else
printf(" ");
}
printf("\n");
}
printf(" ");
for (n = 1; n <= ((MAXCOUNT + 1) * 3); ++n) {
printf("-");
}
printf("-->\n ");
for (n = 1; n <= MAXCOUNT; ++n) {
printf("%3d", n);
}
printf(" >%d 字母个数\n", MAXCOUNT);
return 0;
}


运行时提示:段错误 (核心已转储)

请问哪里有错?
c 段错误
[解决办法]
int?position[maxvalue?+?1][MAXCOUNT?+?1];
?????
????for?(j?=?0;?j?<=?(maxvalue?+?1);?j++)?{
????????for?(k?=?0;?k?<=?(MAXCOUNT?+?1);?k++)?{
????????????position[j][k]?=?BLANK;
????????}
????}

数组越界了
比如说 定义position[2][2]
最多只能用到position[1][1]



[解决办法]
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。

判断是否越界访问,可以在数组的最后一个元素之后对应的地址处设置数据读写断点。如果该地址对应其它变量干扰判断,可将数组多声明一个元素,并设置数据读写断点在该多出元素对应的地址上。

[解决办法]

#include <stdio.h>
#include<malloc.h>

#define MAXCOUNT 10
#define MAXWIDTH 10
#define HAS 1
#define BLANK 0
int main()
{
int wdlth[MAXCOUNT + 1];
int i, j, k, n, c = 0, charcount = 0, maxvalue = 0;

//动态声明二维数据
int rows,columns;
int **position = NULL;



for (i = 0; i <= (MAXCOUNT - 1); ++i)
wdlth[i] = 0;
//遍历
while ((c = getchar()) != '\n') {
if (c == ' '
[解决办法]
c =='\t'
[解决办法]
c == '.'
[解决办法]
c == ',') {
if (charcount != 0) {
if (charcount <= MAXCOUNT) {
++wdlth[charcount - 1];
charcount = 0;
} else {
++wdlth[MAXCOUNT];
charcount = 0;
}
}
} else
++charcount;
}

//取最大值
for (i = 0; i <= MAXCOUNT; ++i) {
if (wdlth[i] > maxvalue)
maxvalue = wdlth[i];
}
printf("aaa%d---%d", maxvalue, MAXCOUNT);

//构造数组[单词数][字母数]、初始化并赋值
rows = maxvalue + 1;
columns = MAXCOUNT + 1;

position = (int **)malloc(sizeof(int *) * rows);

if (NULL == position)
{
return 0;
}

for(i=0;i< columns + 1;i++)
{
*(position + i) = (int *)malloc(sizeof(int) * rows);
if(NULL == *(position + i))
{
return 0;
}
}

for (j = 0; j <= (maxvalue + 1); j++) {
for (k = 0; k <= (MAXCOUNT + 1); k++) {
position[j][k] = BLANK;
}
}


for (j = (maxvalue - 1); j >= 0; --j) {
for (k = 0; k <= MAXCOUNT; ++k) {


if (wdlth[k] > j)
position[j][k] = HAS;
else
position[j][k] = BLANK;
}
}
//输出
printf("单词\n个数\n");
for (j = (maxvalue); j >= 0; --j) {
printf("%2d
[解决办法]
", j + 1);
for (k = 0; k <= MAXCOUNT; ++k) {
if (position[j][k] == HAS)
printf(" *");
else if (j != 0 && position[j - 1][k] == HAS)
printf("%3d", wdlth[k]);
else
printf(" ");
}
printf("\n");
}
printf(" ");
for (n = 1; n <= ((MAXCOUNT + 1) * 3); ++n) {
printf("-");
}
printf("-->\n ");
for (n = 1; n <= MAXCOUNT; ++n) {
printf("%3d", n);
}
printf(" >%d 字母个数\n", MAXCOUNT);
return 0;
}

读书人网 >C语言

热点推荐