【问题标题】:Bus Error with strncpy in CC中strncpy的总线错误
【发布时间】:2012-10-23 07:43:43
【问题描述】:

我正在从事与 question 相同的项目,但 typedef 略有不同:

typedef struct {
    char* word;
    int index;
} data_t;

typedef struct node node_t;

typedef node {
    void *data;
    node_t *left;
    node_t *right;
}

我正在尝试将字符串拆分为单个单词,将其粘贴到 data_t 结构中,然后将其插入到二叉搜索树中。这个想法是,在遍历输入字符串时,当发现该字符是一个标记单词结尾的字符时,将单词开头和结尾之间的字符数复制到一个字符串中,我有尝试使用:

strncpy(newstring, (in+wordstart), (i-wordstart));

地点:

char* newstring, in;
int i, wordstart;

但是,当调用该特定行时,gcc 会给出总线错误。如何修复此总线错误并保留当前解决方案,还是寻找不同的解决方案更明智?

到目前为止,我能想到的唯一想法是,一次一个字符,将字符放入字符串中,直到到达单词的末尾。

【问题讨论】:

  • 您需要发布更多代码。
  • 你是如何为所有这些字符串分配内存的?
  • char* newstring, in 只是指向一些随机内存的指针。您确实需要让它们指向一些有效的内存,即属于进程的内存。
  • 是的,内存根本没有被分配。坚持newstring = malloc(strlen(in)-wordstart); 似乎可以让它发挥作用。
  • 考虑分配+1 字符来存储0-终止符。 @disgruntledperson

标签: c substring c-strings strncpy bus-error


【解决方案1】:

这里没有声明两个指针,这只是一个指针和一个字符

char* newstring, in;

应该这样声明:

char *newstring, *in;

另外,正如其他人所指出的,您似乎没有为这些指针分配任何内存。

【讨论】:

  • 好收获!还有另一个很好的例子,为什么总是在它自己的行上声明一个变量! ;-)
  • 哈哈非常好,感谢您指出!老实说,我把它放在那里是为了表明 strncpy 行是如何定义类型的。 in 通过char *in 传递给函数,尽管newstring 被声明为如上。对此表示歉意,但我会牢记您的观点:)
【解决方案2】:

这个:

typedef node {
    void *data;
    node_t *left;
    node_t *right;
}

根本没有任何意义。在node 之前没有struct 关键字,在} 之后没有您尝试引入的类型别名的名称,也没有终止分号。这不应该编译。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-09
    • 1970-01-01
    相关资源
    最近更新 更多