Int值' j'当我不断尝试调试它时,会得到奇怪的结果。我不确定我的学校编译器是否存在问题,或者它是否是我的代码。谢谢您的帮助。
海湾合作委员会版本: 阅读/usr/local/lib/gcc-lib/sparc-sun-solaris2.7/2.95.2/specs中的规范 gcc版本2.95.2 19991024(发布)
我的代码片段搞砸了:
void sFlag(DIR * dirp, int c, char *dirname)
{
struct dirent *dp;
struct stat statbuf;
struct stat statarray[c];
struct stat tempstat;
char fullfilename[MAXSZ];
int i;
int boo;
int j; /*<--------- variable that's messing up*/
while((dp = readdir(dirp)) != NULL)
{
snprintf(fullfilename, MAXSZ, "%s/%s", dirname, dp->d_name);
if(stat(fullfilename, &statbuf) == -1)
printf("Could not read file %s\n", dp->d_name);
else if(isHiddenFile(dp->d_name))
{
statarray[i] = statbuf;
i++;
}
}
/*As far as i know all the code above works fine*/
/*bubble sort that will sort array by logical file size*/
while(boo)
{
j = 0;
boo = 0;
while(j < c)
{
fprintf(stderr, "%d\n", j); /*print debug info*/
if(statarray[j].st_size < statarray[j+1].st_size)
{
tempstat = statarray[j];
statarray[j] = statarray[j+1];
statarray[j+1] = tempstat;
boo = 1;
}
j++;
}
}
for(j = 0; j < c; j++)
{
printf("%s\t%ld\t%s\n", dp->d_name, statarray[j].st_size, ctime(&statarray[j].st_mtime));
}
}
因此,每次运行此命令时,fprintf都会将j的值打印出来: 0 1 2 3 4 -12975991 ???????它从哪里得到那个号码? 显然我从数组索引超出范围
中得到了一个分段错误任何想法?
答案 0 :(得分:1)
您最有可能践踏记忆并覆盖j
的内容。这个循环:
while(j < c)
{
fprintf(stderr, "%d\n", j); /*print debug info*/
if(statarray[j].st_size < statarray[j+1].st_size)
{
tempstat = statarray[j];
statarray[j] = statarray[j+1];
statarray[j+1] = tempstat;
boo = 1;
}
j++;
}
请注意,它访问statarray[j+1]
,但statarray
定义为
struct stat statarray[c];
意味着在最后一次迭代中j+1 == c
,它超出范围。在数组中写入该索引将会在堆栈中捕获其他内容,其中可能包括j
,并解释为什么你会得到一个古怪的值。
有一些漂亮的工具可以让您更容易找到,例如valgrind
。
答案 1 :(得分:1)
在这个区块中,
while(j < c)
{
fprintf(stderr, "%d\n", j); /*print debug info*/
if(statarray[j].st_size < statarray[j+1].st_size)
{
tempstat = statarray[j];
statarray[j] = statarray[j+1];
statarray[j+1] = tempstat;
boo = 1;
}
j++;
}
j
等于c-1
时,您正在访问未经授权的内存。那会搞砸了。在此之后,你无法预料到可预测的行为。
答案 2 :(得分:0)
j
循环中有一个新变量while
,永远不会设置外j
。