Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C结构中的总线错误_C++_C_Struct_Bus - Fatal编程技术网

C++ C结构中的总线错误

C++ C结构中的总线错误,c++,c,struct,bus,C++,C,Struct,Bus,这是一个代码I测试,用于复制结构 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[1

这是一个代码I测试,用于复制结构

 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 }
它工作正常,更改的原始的值不同!即使我把它指定为指针


此结构赋值有什么问题?

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

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

您可以这样做:

temp.name=“Ahn”

。。。因为您在这里所做的只是更改指针(临时名称)以指向预先设置为包含“Ahn”的不同内存区域

这实际上与结构复制无关。
如果您尝试执行strcpy(people[3]。name,“Ahn”)
则会遇到相同的问题当您声明数据库记录时,所有名称(Fred、Jim、Fred…)都被放入数据段的
只读内存中,并且
名称
字符指针指向它们的起始地址

当您执行strcpy时(临时名称,“Ahn”),您正在尝试以只读方式写入。试图写入
只读
内存将导致总线错误


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

您从不为
temp.name
分配内存,并且数据库中的值指向应视为常量的数据。如果你试图写到那个区域,任何事情都可能发生;您的操作系统显然只是选择触发SIGBUS。我已经尝试了temp->name-like指针赋值,但它抛出了引用错误。然后以“malloc”的方式分配*name字段是有意义的。@我尝试使用
char*name=(char*)malloc(sizeof(char)*100)并且它可以工作。你说得对。我认为模糊记忆总是发生错误。谢谢数组不是指针。您不能分配数组(定义数组时除外),但可以
strcpy
。你可以随意分配指针,但如果你想用它们做些奇怪的事情(比如
strcpy
在只读内存区域上运行),那就由你来决定了。你为什么不使用
people[5]
而不是
*(people+5)
。更具可读性。
 char name[100];