首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >分割故障?getc函数和数组

分割故障?getc函数和数组
EN

Stack Overflow用户
提问于 2014-07-24 21:10:51
回答 2查看 109关注 0票数 1

我正试图编写一个用Xeon编译的程序,它说有一个分段错误?我认为,当我尝试用getc函数填充数组时。我编写了这段代码几种不同的格式,我知道这可能不是最有效的,但是我需要测试它,看看它是否能通过并行化来工作。

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
//#include <omp.h>

int main()
{
    struct stat buf1;
    struct stat buf2;

    FILE *fp1, *fp2;
    int ch1, ch2;
    clock_t elapsed;
    char fname1[40], fname2[40];

    printf("Enter name of first file:");
    fgets(fname1, 40, stdin);
    while (fname1[strlen(fname1) - 1] == '\n')
    {
        fname1[strlen(fname1) -1] = '\0';
    }

    printf("Enter name of second file:");
    fgets(fname2, 40, stdin);
    while (fname2[strlen(fname2) - 1] == '\n')
    {
        fname2[strlen(fname2) -1] = '\0';
    }

    fp1 = fopen(fname1, "rb");
    if (fp1 == NULL)
    {
        printf("Cannot open %s for reading\n", fname1);
        exit(1);
    }

    fp2 = fopen(fname2, "rb");
    if (fp2 == NULL)
    {
        printf("Cannot open %s for reading\n", fname2);
        exit(1);
    }

    stat(fname1, &buf1);
    size_t size1 = buf1.st_size;

    stat(fname2, &buf2);
    size_t size2 = buf2.st_size;

    printf("Size of file 1: %zd\n", size1);
    printf("Size of file 2: %zd\n", size2);

    elapsed = clock(); // get starting time

    size_t smallest = 0;

    if(size1 < size2)
    {
        smallest = size1;
    }
    else
    {
        smallest = size2;
    }

    printf("Smallest Value: %zu\n", smallest);

    size_t i, j, k;
    size_t data[smallest];
    size_t arry1[smallest];
    size_t arry2[smallest];

    unsigned long long counter = 0;

    for(i = 0; i < smallest; i++)
    {
        data[i] = 1;
        arry1[i] = getc(fp1);
        arry2[i] = getc(fp2);
    }

    //#pragma omp for //reduction(+:counter)
    for(k = 0; k < smallest; k++)
    {
        if((arry1[k] ^ arry2[k]) == 0)
        {
            counter+= data[k];
        }
    }

    fclose (fp1); // close files
    fclose (fp2);

    float percent = (float)counter / (float)smallest * 100.0f;

    printf("Counter: %zu Total: %zu\n", counter, smallest);
    printf("Percentage: %.2f%\n", percent);

    elapsed = clock() - elapsed; // elapsed time
    printf("That took %.2f seconds.\n", (float)elapsed/CLOCKS_PER_SEC);
    return 0;
}

谢谢你提前帮忙!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-24 21:21:39

不能声明在编译时不知道的数组的大小:

代码语言:javascript
复制
int smallest;

smallest = .... // some computation

size_t data[smallest]; // this is wrong!

相反,您应该使用malloc()来完成这个任务:

代码语言:javascript
复制
size_t *data;

smallest = ... // whatever
data = malloc(smallest * sizeof(size_t));
票数 2
EN

Stack Overflow用户

发布于 2014-07-24 21:29:19

这个循环:

代码语言:javascript
复制
while (fname1[strlen(fname1) - 1] == '\n')
    fname1[strlen(fname1) -1] = '\0';

如果行为空(即"\n"),则将读取字符串的开头。将while更改为if

另外,在声明VLA之前,请检查smallest > 0

输出smallest的值可能很有见地,典型的系统默认为1MB到8MB之间的堆栈大小,所以这里可能会导致堆栈溢出。您可以通过使用malloc来消除这种可能性,正如ocho88所建议的(但没有伪造的强制转换):

代码语言:javascript
复制
size_t *data = malloc(smallest * sizeof *data);
size_t *arry1 = malloc(smallest * sizeof *arry1);
size_t *arry2 = malloc(smallest * sizeof *arry2);

if ( !data || !arry1 || !arry2 )
     // exit with out-of-memory error

我不知道为什么要使用size_t来存储getc的结果。

如果这不能解决问题,那么识别哪一行是分段错误将是有用的。如果调试器无法工作,那么您可以输出(到stderr,或使用fflush的stdout )来找出它的位置。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24944032

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档