调用void函数

时间:2016-11-18 17:39:53

标签: c pointers segmentation-fault

修改:根据要求,我已将代码包含在' ledic'中。然而,它从未运行 - 任何一个,甚至不是一个hello world printf作为第一行,所以我相对肯定问题永远不会在内。

Edit2:具有讽刺意味的是, 在' ledic'功能。看起来我对此的理解比我之前想的要少。

我正在为我目前在Uni的项目写作,我周围没有人可以找出这个分段错误。它应该非常简单,所以我感谢你的帮助。

代码如下:

#include <stdlib.h>
#include <string.h>
#include <stdio.h>

void ledic(FILE *fp){

    printf("Hello world\n");

    int len;
    int j, i, k;
    char palavra[30];
    char dictionary[30][10000][30];
    int VecOcorrencias[30];


    for (j=0; j<30; j++)
    VecOcorrencias[j]=0;

    printf("Hello world\n");

    while ( fscanf(fp, "%s", palavra) == 1 ) {

        len = strlen(palavra);
        k = VecOcorrencias[len];
        strcpy (dictionary[len][k], palavra);
        VecOcorrencias[len]++;
    }
for (i=0; i<1000; i++)
printf("%s %d\n", dictionary[5][i], VecOcorrencias[5]);
}

}

FILE *OpenFile( char *nome, char *mode){

FILE *fp;
fp = fopen (nome, mode);
if( fp == NULL){
    printf(" Cant open file\n");
    exit(1);
}

return (fp);
}

int main( int argc, char *argv[]){

FILE * fp;

fp = OpenFile( argv[1], "r");

ledic(fp);

return(0);

}

代码在进入void ledic(FILE *fp)函数时中断,并表示它无法访问引用的内存(我想* fp)。

我不能为我的生活找出原因。有什么想法吗?

1 个答案:

答案 0 :(得分:3)

声明char dictionary[30][10000][30];创建一个9Mb变量30 * 30 * 1000 = 9'000'000。由于它是一个局部变量,它在堆栈上创建,典型Linux机器上的默认堆栈大小仅为8Mb(在Windows上甚至只有1Mb)。

如果将其声明为static,则该变量不在堆栈中,因此它可能比堆栈大小占用更多内存。

有关static关键字的详细信息,请参阅this SO article

相关问题