我正试图编写一个用Xeon编译的程序,它说有一个分段错误?我认为,当我尝试用getc函数填充数组时。我编写了这段代码几种不同的格式,我知道这可能不是最有效的,但是我需要测试它,看看它是否能通过并行化来工作。
#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;
}谢谢你提前帮忙!
发布于 2014-07-24 21:21:39
不能声明在编译时不知道的数组的大小:
int smallest;
smallest = .... // some computation
size_t data[smallest]; // this is wrong!相反,您应该使用malloc()来完成这个任务:
size_t *data;
smallest = ... // whatever
data = malloc(smallest * sizeof(size_t));发布于 2014-07-24 21:29:19
这个循环:
while (fname1[strlen(fname1) - 1] == '\n')
fname1[strlen(fname1) -1] = '\0';如果行为空(即"\n"),则将读取字符串的开头。将while更改为if。
另外,在声明VLA之前,请检查smallest > 0。
输出smallest的值可能很有见地,典型的系统默认为1MB到8MB之间的堆栈大小,所以这里可能会导致堆栈溢出。您可以通过使用malloc来消除这种可能性,正如ocho88所建议的(但没有伪造的强制转换):
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 )来找出它的位置。
https://stackoverflow.com/questions/24944032
复制相似问题