C ++指针数组的结构

时间:2017-11-02 07:22:51

标签: c++ arrays pointers struct

#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的输出而不是其他任何内容,但如果我没有初始化电话号码,那么我会输出名称。

2 个答案:

答案 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 | 
+---+---+---+---+---+---+---+---+---+

没有任何电话号码为空终结符提供空间,并且覆盖超出其空间。这实际上是下一个数组元素名称。