【问题标题】:how to fix this #0 0xfeea5b41 in strcpy () from /lib/libc.so.1如何在 /lib/libc.so.1 的 strcpy () 中修复此 #0 0xfeea5b41
【发布时间】:2015-09-21 15:21:32
【问题描述】:

我想读取一个文件并将其存储在一个列表中。我确实这样做了,但是当我使用 gdb 时出现此错误:

#0  0xfeea5b41 in strcpy () from /lib/libc.so.1.

代码如下:

int
main (int argc, char *argv[])
{
  /*declare and initialise variable */
  char array[10][150], buffer[150];
  //message =(char*)malloc(sizeof(char));
  int i = 0;
  FILE *fp;
  fp = fopen (argv[1], "r");
  if (fp == 0)
    {
      fprintf (stderr, "Input not valid\n");
      exit (1);
    }
  /*stores and prints the data from the string */
  int counter = 0;
  while (fgets (buffer, 150, fp))
    {
      strcpy (array[i], buffer);
      //printf(" %s",message[i]);
      i++;
      counter++;
    }
  fclose (fp);
  return 0;
}

【问题讨论】:

  • 除了缩进不好、没有#include 以及将fp 与整数0 进行比较之外,似乎没有什么不好的地方。你的输入文件的内容是什么?
  • i++; 应该检查范围,因为它索引多达 10 个元素。如果有超过 10 个文件读取,您将破坏数组。

标签: c file-handling


【解决方案1】:

这里有几个问题。

  1. 如果存在超过 10 行,您将超出 array,并且 strcpy 将尝试复制到无效位置。我认为这是错误的原因。

  2. fopen 在出错时返回一个指针(所以 NULL),而不是 0。

  3. 你没有检查fgets的返回值;出错时返回NULL。

  4. 递增counter 和i 似乎是多余的,因为它们的值相同。

  5. 您没有#included 相关的包含文件,因此您的 C 编译器将无法选择正确的函数原型。您需要:#include <stdio.h>、#include <stdlib.h> 和 #include <string.h>。您可以通过使用gcc -Wall 编译来获取它。

【讨论】:

  • 0 是一个空指针常量,所以fp == 0 在技术上是好的(不过它可能会误导人类读者)。
  • exit(1) 不可移植,但是:唯一的标准退出值是 0 和 EXIT_SUCCESS 表示成功,EXIT_FAILURE 表示错误。
  • @melpomene 真的吗? pubs.opengroup.org/onlinepubs/009695399/functions/exit.html 说 “status 的值可以是 0、EXIT_SUCCESS、EXIT_FAILURE 或任何其他值,但只有最低有效 8 位(即status & 0377)可用于等待的父进程” - 在我看来,这三个值以外的值是允许的。
  • 这是 POSIX。我说的是标准 C。当然,其他值可能是允许的,但它们的解释取决于您所在的系统。例如,exit(1) 可能代表成功,而 exit(2) 触发核心转储......或其他东西。
  • @melpomene: 7.20.4.5 第 3 段说除了这三个之外的返回码是实现定义的。但是,由于成功和不成功的案例也是“实现定义的”,我认为其他值的可移植性并不差!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-11
  • 1970-01-01
  • 2012-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-09
相关资源
最近更新 更多