首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

C 提示段异常

2013-04-20 
C 提示段错误#include stdio.h#defineMAXCOUNT10#defineMAXWIDTH10#defineHAS1#defineBLANK0int main(){

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;
}

热点排行