#include<iostream.h>
#include<conio.h>
#include<string.h>
#include<stdio.h>
struct telephone
{
char name[10];
char tno[9];
};
void main()
{
telephone a[5];
clrscr();
telephone* p;
p = a;
strcpy(a[0].name, "Aditya"); // initializing the array
strcpy(a[1].name, "Harsh");
strcpy(a[2].name, "Kartik");
strcpy(a[3].name, "Ayush");
strcpy(a[4].name, "Shrey");
strcpy(a[0].tno, "873629595");
strcpy(a[1].tno, "834683565");
strcpy(a[2].tno, "474835595");
strcpy(a[3].tno, "143362465");
strcpy(a[4].tno, "532453665");
for (int i = 0; i < 5; i++)
{
puts((p+i)->name);cout<< " "; //command for output
puts((p+i)->tno );cout<<endl;
}
getch();
}
在这段代码中,在输出时,我没有输出名称。我只获得(p+0)->name
的输出而不是其他任何内容,但如果我没有初始化电话号码,那么我会输出名称。
答案 0 :(得分:2)
struct
存储在连续内存位置中,因此当您分配tno
变量时,会尝试将高于其边界大小的数据存储在其中,剩下的比特会被添加到下一个内存位置。
在您的代码tno [9]
中,它可以存储最大 9个字符,但您只能提供 9个字符,但strcpy的作用是它还向最后添加\0
,它尝试将其添加到tno [10]
,,它不存在并超出界限并将其存储在其他内存位置,可能是下一个数组,这会导致未定义的行为。
您只需按如下方式更改结构定义:
struct telephone
{
char name[10];
char tno[10]; // if you intend to store 9 digit number
};
请记住,如果您打算将 x字符存储在字符数组中,那么您的数组必须大小为 x + 1 。如果使用字符数组似乎很困难,也许你可以使用std::string
答案 1 :(得分:0)
电话号码必须至少增加一个。 电话号码超过一个字节进入下一个阵列,并将名称更改为&#39; \ 0&#39;
strcpy(a[0].tno ,"873629595" );
从
变成[1] .name"Harsh\0"
到
"\0arsh\0"
结构布局
+---+---+---+---+---+---+---+---+---+---+
| A | d | i | t | y | a | \0| | | |
+---+---+---+---+---+---+---+---+---+---+
+---+---+---+---+---+---+---+---+---+
| 8 | 7 | 3 | 6 | 2 | 9 | 5 | 9 | 5 |
+---+---+---+---+---+---+---+---+---+
+---+---+---+---+---+---+---+---+---+---+
| \0| a | r | s | h | \0| | | | |
+---+---+---+---+---+---+---+---+---+---+
+---+---+---+---+---+---+---+---+---+
| 8 | 3 | 4 | 6 | 8 | 3 | 5 | 6 | 5 |
+---+---+---+---+---+---+---+---+---+
没有任何电话号码为空终结符提供空间,并且覆盖超出其空间。这实际上是下一个数组元素名称。