c - 矩阵上奇怪的段错误(核心转储)

标签 c memory segmentation-fault

所以,我有这部分代码:

for (lin = 0; lin < linhas_mat1; lin++)
{
    fgets(linha_s, MAX_LINHA, matriz1_file);
    buffer = strtok(linha_s, " ");
    for (col = 0; col < colunas_mat1; col++)
    {
        printf ("\nCOLUNA: %d", col);
        if (&matriz1[lin][col] == NULL)
            printf ("erro");
        matriz1[lin][col] = atoi(buffer);
        buffer = strtok(NULL, " ");
    }
}

它将文件中的矩阵放入内存中。打开和分配没有给出错误(至少我认为)。奇怪的是,错误似乎发生在最后两个元素上(通过打印当前行号发现)(在最后一个元素之前,上面的代码或最后一个元素,如果我添加一些打印,那就更奇怪了)并且仅当矩阵有 5 行或更多。前面的行被毫无问题地添加到内存中,所以我不明白为什么最后一个元素会出现问题。有人知道问题是什么或有一些关于如何找到问题的提示吗?

最佳答案

代码本身没有问题。我能看到的唯一可能的原因是,当输入文件的列数少于您指定的列时,它将导致段错误。

这是代码的完整版本,我只添加了一些初始化

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

int main() {

  int lin, col, linhas_mat1, colunas_mat1;

  char* buffer;
  char linha_s[1023];
  int matriz1[8][5];
  linhas_mat1 = 8; colunas_mat1 = 5;
  const int MAX_LINHA = 20;

  FILE *matriz1_file = fopen("aa.txt", "r");

  for (lin = 0; lin < linhas_mat1; lin++)
  {
    fgets(linha_s, MAX_LINHA, matriz1_file);

    buffer = strtok(linha_s, " ");
    for (col = 0; col < colunas_mat1; col++)
    {
      //printf ("\nCOLUNA: %d", col);
      if (&matriz1[lin][col] == NULL)
        printf ("erro");
      matriz1[lin][col] = atoi(buffer);
      printf("%d ", matriz1[lin][col]);
      buffer = strtok(NULL, " ");
    }
    printf("\n");
  }
}

如果您提供以下文件作为输入,矩阵将毫无问题地获取所有值,除非您从中删除某些列。

1 2 9 4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5

关于c - 矩阵上奇怪的段错误(核心转储),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16349582/

相关文章:

c++ - 组框外观

c++ - 在 Windows 上检测所有可用串行端口的正确方法是什么?

android - 奇怪的应用程序内存管理

c - 段错误,大型数组

二分法求解方程的C程序

c++如何测试堆中的某一位内存是否空闲?

assembly - ARMv8 高级 SIMD : "invalid addressing mode at operand 2 -- ` st1 {V1. D}[0],[x20,640 ]'"

c++ - bst分割故障搜索

c++ - 段错误

使用指针输入结构值时 scanf 函数中的混淆