【问题标题】:(C) Segmentation Fault/Error (11) ? How do I find the cause?(C) 分段错误/错误 (11) ?我如何找到原因?
【发布时间】:2019-03-20 20:39:41
【问题描述】:

访问数组越界是否会导致分段错误?还是与访问指针有关?我不认为我已经到达阵列之外。会是什么?

char *files[300][300];
char *rebuildFile[300];
int rebuildCount = 0;

void rebuildCheck(){
int i, j;

for(i=1; i<300; i++){
    char * target;
    time_t targetCreationDate = time(NULL);

    for(j=0; j<300; j++){
        if(j==0){
            target = files[i][j];
            char * targetPath = pathAppend(files[i][j]);
            targetCreationDate = getFileCreationTime(targetPath);
        }
        else if(files[i][j] == NULL){
            continue;
        }
        else{
            char * path = pathAppend(files[i][j]);
            time_t dependancyCreationDate = getFileCreationTime(path);
            if(difftime(dependancyCreationDate, targetCreationDate) > 0){
                rebuildFile[rebuildCount] = files[i][j];
                printf("rebuildFile[%i]: %s\n", rebuildCount, rebuildFile[rebuildCount]);
                ++rebuildCount;
            }
        }
    }
}
}

【问题讨论】:

  • 我认为我没有到达数组之外...你为什么不通过添加一些代码来检查呢?还可以考虑使用一个调试器,它会告诉你究竟在哪里发生了段错误。
  • 你如何/在哪里初始化files的所有元素?
  • 您需要edit您的问题并向我们展示pathAppend功能。问题可能出在那里。 pathAppend 返回一个指向字符串的指针,这里很多事情都可能出错。但是没有看到那个代码,没有人能说出来。你也没有告诉我们files是如何初始化的,很多事情也可能出错,也许其中一个字符指针是NULL,这可以解释分段错误
  • @Jabberwocky 谢谢!是的,确实,pathAppend 返回了一个 NULL 字符指针值,所以它弄乱了代码。
  • @NickWalters 仍然edit 你的问题并显示功能,可能还有其他你不知道的问题。

标签: c pointers memory segmentation-fault


【解决方案1】:

变量rebuildCount 在内部for 循环中递增,这意味着它可能会增加到300 * 300。

那么下面的语句:

rebuildFile[rebuildCount] = files[i][j];

最终会访问越界内存,因为 rebuildFile 中只有 300 个元素。

【讨论】:

  • 永远无法确定。既然你在打印它,那么它在异常发生之前达到的值是多少?
  • 我的程序的rebuildCount 的最终值为5。所以这不应该是问题...
  • 您是否在将诸如 targetPath 之类的指针用作参数之前对其进行检查?访问无效指针也可能导致异常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多