我有一个具有名称变量的结构,即:
l->name
我也有一系列角色:
char highest1[50];
我想将l->name
复制到highest1[50]
,但我不能这样做。
我在这里做了什么违法行为吗?
strcpy(highest1[50], l->name);
runtime error: index 50 out of bounds for type 'char [50]'
我尝试将char[50]
增加到char [99]
,但后来我得到了:
runtime error - illegal array, pointer or other operation
关于致命的ASAN信号?
答案 0 :(得分:2)
我在这里做了什么非法行为:
strcpy(highest1[50], l->name);
是的,代码在这里做了非法的事情。
highest1[50]
是元素50的值,某个整数值,并且被视为要复制到的位置的地址。
同样使用char highest1[50];
,尝试使用highest1[50]
查找数组外部的值是未定义的行为(UB)。
避免这种基本错误
1)启用所有编译器警告以节省您的时间。 2)以不超出其大小的方式复制到highest1[]
。
size_t len = strlen(l->name);
if (len >= sizeof highest1) Handle_Error();
else {
strcpy(highest1, l->name);
}
答案 1 :(得分:1)
我在这里做了什么非法行为:
是的:两件事
highest1
的有效索引为0到49。strcpy(highest1, l->name)
,因为highest1[0]
是一个字符,不是指向一个字符。答案 2 :(得分:0)
highest1[50]
是highest
的51个元素,因此您将基本上错误的地址传递给strcpy
,该地址将两个char
指针作为输入。
您应该调用strcpy(highest1, l->name)
,因为数组的名称是第一个元素的地址位置。
另请注意,如果您有一串4个字符,请参阅。 “aaaa”然后数组应该有5个元素来包含终止字符'\ 0'。