【问题标题】:C Structures Bus Error 10C 结构总线错误 10
【发布时间】:2012-11-18 17:35:38
【问题描述】:

我在 C 中有一个结构,我使用一个函数从用户那里获取结构的值。下面是我的结构。

typedef struct {
    char    *name;
    char    *chemical_symbol;
    char    *class;
    int     atomic_number;
    double  atomic_weight;
    int     *electrons;
} element_t;

这是我用来从用户那里获取值的函数。在询问化学符号后,问题出在此功能上。我得到总线错误:10。我对总线错误的理解是处理器无法尝试访问内存。任何帮助表示赞赏。谢谢!

element_t scan_element() {

    element_t element;

    printf ("Enter New Element Information:\n\n");

    printf("Element Name: ");
    scanf("%s", element.name);

    printf("Element Chemical Symbol: ");
    scanf("%s", element.chemical_symbol);

    printf("Element Class: ");
    scanf("%s", element.class);

    printf("Element Atomic Number: ");
    scanf("%d", &element.atomic_number);

    printf("Element Atomic Weight: ");
    scanf("%lf", &element.atmoic_weight);

    printf("Element Electrons: ");
    scanf("%p", &element.electrons);

    return(element);
}

【问题讨论】:

    标签: c struct structure


    【解决方案1】:
    printf("Element Name: ");
    scanf("%s", element.name);
    

    您必须为element.name 指向的对象分配内存,例如使用malloc。没有正确分配element.name 是一个无效的指针。

    【讨论】:

      【解决方案2】:

      您没有分配足够的内存来尝试读入您的字符串。

      顺便说一句,你最后的scanf 很奇怪:你真的要问地址吗?这可能很危险。

      【讨论】:

        【解决方案3】:

        您需要分配内存。也许最好的(当然是最简单的!)方法是简单地定义你的结构以具有字符数组(而不是字符指针)。

        示例:

        #define MAX_STRING 80
        #define MAX_ELECTRONS 32
        
        typedef struct {
            char    name[MAX_STRING];
            char    chemical_symbol[MAX_STRING];
            char    class[MAX_STRING];
            int     atomic_number;
            double  atmoic_weight;
            int     electrons[MAX_ELECTRONS];
        } element_t;
        

        【讨论】:

          【解决方案4】:

          在扫描字符串之前,应该为它们分配一些空间。例如:

          void initialize( element_t * p ) {
            p->name = malloc( sizeof( char ) * MAXSIZE );
            p->chemical_symbol = malloc( sizeof( char ) * MAXSIZE );
            p->class = malloc( sizeof( char ) * MAXSIZE );
          }
          

          在致电scan_element 之前,请致电initialize。我确信它会正确编译。

          【讨论】:

          • 使用完字符串后不要忘记free()
          猜你喜欢
          • 1970-01-01
          • 2017-07-01
          • 1970-01-01
          • 2010-12-25
          • 1970-01-01
          • 1970-01-01
          • 2016-07-14
          • 2012-05-02
          • 1970-01-01
          相关资源
          最近更新 更多