C结构中的总线错误

时间:2013-12-18 02:00:02

标签: c++ c struct bus

这是我测试复制struct的代码。

 1 #include <stdio.h>
 2 #include <string.h>
 3 
 4 typedef struct emp_struct {
 5     char *name;
 6     int employee_no;
 7     float salary,
 8           tax_to_date;
 9 } Employee;
 10 
 11 typedef Employee Database[10];
 12 
 13 Database people = {
 14     {"Fred", 10, 10000, 3000},
 15     {"Jim", 9, 12000, 3100.5},
 16     {"Fred", 13, 1000000, 30},
 17     {"Mary", 11, 170000, 4000},
 18     {"Judith", 45, 130000, 50000},
 19     {"Nigel", 10, 5000, 1200},
 20     {"Trevor", 10, 20000, 6000},
 21     {"Karen", 10, 120000, 34000},
 22     {"Marianne", 10, 50000, 12000},
 23     {"Mildred", 10, 100000, 30000}
 24 };
 25 
 26 int main () {
 27     // array act like pointer, thus pointing + pointing = ERROR
 28     printf("people[1]->name: ERROR\n");
 29     // jump its memory amount of struct size
 30     printf("(people+1)->name:%s\n",(people+1)->name);
 31     // array works as a pointer
 32     printf("people[3].name:%s\n",people[3].name);
 33 
 34     /* Is it possible to assign struct to struct? */
 35     printf("\nAssigning struct to struct\n");
 36     Employee temp;
 37     temp = *(people+5); // Nigel Record
 38     printf("Name: %s\n",temp.name);
 39     // exchange
 40     strcpy(temp.name, "Ahn");
 41     printf("Changed: %s\n",temp.name);
 42     printf("Original: %s\n",people[5].name);
 43 
 44     return 0;
 45 }

当我在第40行尝试 strcpy(new,string)时,它会抛出总线错误:10

我预计第41行和第42行的值已更改原始相同但不起作用。分配有什么问题?

我知道Bus错误:由于缺少分配空间而发生了10。但是我在struct中的 name 字段是指针(在第5行)。如果我更改名称字段

 char name[100];

它正常工作,已更改原始值不同!即使我将其指定为指针。

这个结构分配有什么问题?

2 个答案:

答案 0 :(得分:3)

temp.name是指向char的指针。 在复制temp = *(people+5);之后,temp.name指向包含“Nigel”的字节。

到目前为止,没问题。但你不能使用该指针作为strcpy()的输出; strcpy将尝试覆盖它,并将其存储在只读存储器中。

你可以这样做:

temp.name =“Ahn”;

...因为你在这里所做的就是改变指针(temp.name)以指向预先设置的包含“Ahn”的不同内存区域。

这实际上与结构复制无关。 如果您尝试strcpy(people[3].name, "Ahn")

,则会遇到同样的问题

答案 1 :(得分:1)

当您声明数据库记录时,所有名称(Fred,Jim,Fred ...)都放在数据段的read-only内存中,name字符指针指向它们的起始位置地址。

执行strcpy(temp.name, "Ahn");时,您尝试以只读方式写入。尝试写入read-only内存会导致总线错误。

解决方案是为name分配内存,然后执行strcpy。另外一个好的编程习惯是使用strncpy而不是strcpy