【问题标题】:segmentation fault while writing to file [duplicate]写入文件时出现分段错误[重复]
【发布时间】:2018-08-06 19:53:21
【问题描述】:

我在将数据写入文件时遇到分段错误。这是代码

 int arr[N]; // where N = 1508065

f = fopen( "datafile.txt", "w" );

if (f == NULL)

{

    printf("Error opening file!\n");
    exit(1);
}

for( i=1;i<=N;i++)

    {
       arr[i]=rand()%100;
       fprintf(f, "%d  %d  %d\n",i,1,arr[i] );
    } 

fclose(f); 

我已经尝试过使用 double arr[N] 即使这样是分段错误。当 N 较小时,它可以正常工作。

【问题讨论】:

  • 您正在读取数组的末尾。
  • 你可能会炸毁你的堆栈 --> STACK OVERFLOW 使用一个由1,508,065 整数或6,032,260 字节数据组成的整数数组。当心。动态分配该存储空间可能是明智之举。

标签: c file segmentation-fault


【解决方案1】:

访问 N 大小数组的 N-th 索引是未定义的行为。您正在越界访问数组。它将是for( i = 1; i &lt; N; i++)。

来自标准:J.2 在未定义行为下

数组下标超出范围,即使对象显然可以使用给定的下标访问(如在左值表达式 a1[7] 中给出声明 int a[4][5])

正如您所使用的 - 数组在 中被索引为 0。

【讨论】:

    【解决方案2】:

    for( i=1;i&lt;=N;i++) 将给出未定义的行为。

    C 数组从 0 开始到 N-1。访问元素 N 是不行的。

    应该是for( i=0;i&lt;N;i++)

    【讨论】:

      【解决方案3】:

      当 N 较小时,它可以正常工作。

      我假设您将arr 创建为局部变量,对于N = 1508065,它在堆栈上分配了超过 5 MB 的内存-您遇到了堆栈溢出。您应该使用malloc 函数分配arr 或将此数组创建为全局变量。

      以前的答案中指出了读数超出范围的问题。

      【讨论】:

      • 感谢您的快速回答。用 malloc 声明它可以正常工作。即使使用 for(i=1;i 也没有分段错误
      • 将 i&lt;=N 更改为 i &lt; N,您无法读取超出范围 - 这是未定义的行为。
      • 谢谢我已经把它改成了i
      猜你喜欢
      • 1970-01-01
      • 2013-08-31
      • 1970-01-01
      • 1970-01-01
      • 2012-01-03
      • 2022-01-03
      • 2014-04-04
      • 2016-09-02
      • 1970-01-01
      相关资源
      最近更新 更多