c - 在 C 中同时使用两个函数实现 fread、fopen 和 fwrite 会导致错误吗?

标签 c

早上好,

我刚刚完成了我的源代码,其中包含一个函数,用于获取数组的元素并将其写入文件,然后另一个函数将新创建的文件中的元素复制到新数组。注意,我在这里坦白说,这是我的作业,我已经完成了。然而,奇怪的是,当我执行自己的测试时,它有效,但是当我将其提交给在线正确性检查器时,它似乎因大量而失败。

我的代码在这里:

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

typedef struct {
  int* data;
  unsigned int len;
} intarr_t;


int intarr_save_binary( intarr_t* ia, const char* filename )
{
     FILE *fp;
     int* tmp = malloc(sizeof(int)*ia->len+1);
     tmp[0] = ia->len;

     int i=0;
     for(i = 0; i<ia->len+1; i++)
     {
          tmp[i+1] = ia->data[i];

     }  
     fp = fopen( filename , "wb" );
     fwrite(tmp, sizeof(int), ia->len+1, fp );
     fclose( fp );
     return 0;
}

 intarr_t* intarr_load_binary( const char* filename )
 {
     int i = 0;
     intarr_t *tmp = malloc( sizeof( intarr_t ) );
     if(tmp==NULL)
     {
         return NULL;
     }
     FILE *fp;  
     fp = fopen( filename , "r" );
     int len;
     fread( &len, sizeof(int), 1, fp );
     tmp->len = len;
     tmp->data = malloc( ( len ) * sizeof( int ) );
     if(tmp->data == NULL)
     {
         return NULL;
     }
     fread(tmp->data, sizeof(int), len, fp);
     fclose(fp);
     return tmp;
}

因此,第一个函数采用一个 char 数组,其中包含文件名和我在最顶部定义的结构,其要点是我创建一个长度为 +1 的新数组并存储原始数组的长度数组由第一个索引中的结构传递给我,其余索引将存储元素。然后我将其中的所有内容存储到一个文件中。之后,我调用第二个函数并打开同一个文件并读取文件中的第一个内容,即长度,然后使用该长度将文件中的其余内容读取到新数组中。之后我返回一个指向它的指针。

在线代码检查给我的提示是,它可能由于断言失败或原始数组的长度与新数组的长度不匹配而中止。

**我个人看到的唯一主要问题是在我的 typedef 中我有 unsigned int len 而在我的函数中我使用 int len。或者我没有释放在第一个函数中使用 malloc 创建的第一个 tmp 数组。但我认为这不会影响结果..

最佳答案

如果没有从您正在使用的在线代码检查中进行更好的诊断,就很难查明错误。如果您怀疑在线代码检查对于较大的数字(数组大小?)失败,您可能需要扩展自己的测试以更好地覆盖该场景。如果您怀疑该错误是段错误(我认为可能是这种情况,请参见下文),您还可以尝试在 valgrind 等工具中运行您的程序,它可以告诉您是否有任何非法内存访问。像这样的错误可能会在您的本地系统上意外地起作用,但在其他系统上会失败。

话虽如此,我认为当您访问使用 malloc 分配的内存时,intarr_save_binary 中存在错误。仔细查看您分配了多少字节的内存。假设 ia->len 为 3,sizeof(int) 为 4,在这种情况下,您将分配 3*4 + 1 = 13字节,显然不足以容纳 4 个整数。另外你似乎有一个 Off-by-one error在下面的循环中。

关于c - 在 C 中同时使用两个函数实现 fread、fopen 和 fwrite 会导致错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27092698/

相关文章:

c - 分析 u-Boot/内核启动顺序

C - 如何读取未知长度的字符串

c - 内核开发、内存分配器和 kprintf() 奇怪的输出

c - 错误 : expected identifier or '(' before numeric constant

c - 低效地使用 strstr 和 strchr

c++ - 为什么 POSIX 允许在现有文件结尾 (fseek) 之外寻找只读模式

python - 扩展 Python : pre-load my C module

c - 使用标准输入时等待 EOF

编码/配置 OpenSSL 服务器以获得最大兼容性

c++ - 有没有线程太多这样的事情?