【问题标题】:Seg Fault (Whats Wrong, strcpy)段错误(什么是错的,strcpy)
【发布时间】:2011-03-05 03:24:57
【问题描述】:

在 GDB 中我得到:

(gdb) 回溯 0 0xb7d91544 in strcpy () from /lib/libc.so.6 1 0x08048982 在 ISBN::ISBN(char const*, ISBNPrefix&) () 2 0x08048d4a 在 main () (gdb)

从此代码:

ISBN::ISBN(const char* str, ISBNPrefix& list) {
    if(isValid(str)) {
            isSet = true;
            sprintf(*isbnStr,"%s",str);
    }
}

究竟是什么原因造成的?

isbnStr 在标头中创建:

class ISBN
{
 ...
    char* isbnStr[11];
 ...

关于我在这里可以做什么来导致此段错误的任何想法?

main中的调用是:

ISBN* isbn = new ISBN("7999999008",*prefix);

【问题讨论】:

  • 顺便说一句,根据维基百科,2007 年及以后分配的 ISBN 有 13 位而不是 10 位。
  • 谢谢,该程序一次将处理 100 条记录,我还没有任何计划接受新的 ISBN,但很高兴知道我是否会扩展它。

标签: c++


【解决方案1】:

isbnStr 是一个字符串数组(或更具体地说是字符指针),而不是字符数组。我想你的意思是char isbnStr[11];

【讨论】:

  • 接下来,sprintf(*isbnStr,"%s",str); 应该是 strncpy(isbnStr, str, sizeof(isbnStr));
  • @rlibby:如果没有明确地将最后一个字符设置为 nul,切勿使用 strncpy
【解决方案2】:

您是否正在做任何事情来初始化isbnStr?如果不是,它可能是一个无效的指针,这可能会导致您的程序崩溃。

【讨论】:

    【解决方案3】:

    您正在尝试将str (a char*) 处的字符串复制到 isbnStr[0] (a char*) 中,但 isbnStr 是 11 个 char* 的有效数组,那些 @987654327 @s 未初始化并指向垃圾地址。为isbnStr[0]isbnStr[10] 分配内存。

    注意:无论出于何种原因,我假设您 确实 意味着将 isbnStr 设为 11 char*s 的数组。如果您希望 isbnStr 成为 11 个字符的数组,请将其声明为 char isbnStr[11] 并且不要在您的 sprintf 中取消引用 isbnStr

    【讨论】:

      猜你喜欢
      • 2012-09-21
      • 2012-01-11
      • 1970-01-01
      • 2011-02-21
      • 2014-06-15
      • 1970-01-01
      • 2012-02-20
      • 2020-10-05
      • 2014-10-21
      相关资源
      最近更新 更多