0

我正在尝试将输入分配给具有指针数组的多个结构,指向每个分配的结构。我一直在尝试填充一个结构并打印它,但不断出错并且找不到原因。有任何想法吗?

谢谢您的帮助。

/* Structure declaration */

struct personCatalog {
  char name[50];
  char address[50];
  char cityState[50];
  char zipCode[7];
} ;

//function to fill structures

void getPerson (struct personCatalog *ArrayOfPointers[]);

   int main(int argc, const char * argv[])
 {

struct personCatalog *pointerArray[51]; 

getPerson(pointerArray);

 }

void getPerson (struct personCatalog *ArrayOfPointers[]){

struct personCatalog *tempPointer;

char stringCollector[512];

int maxNumberOfPeople = 51;
int num = 0;

while ((gets(stringCollector) != NULL) && (num < maxNumberOfPeople)) {

    tempPointer = (struct personCatalog *) malloc(sizeof(struct personCatalog));
    strcpy(tempPointer->name, stringCollector);
    gets(tempPointer->address);
    gets(tempPointer->cityState);
    gets(tempPointer->zipCode);

    ArrayOfPointers[num] = tempPointer;

    num++;

    printf("%s", ArrayOfPointers[num]->name);
    printf("%s", ArrayOfPointers[num]->address);
    printf("%s", ArrayOfPointers[num]->cityState);
    printf("%s", ArrayOfPointers[num]->zipCode);

}

 ArrayOfPointers[num] = '\0';
}
4

2 回答 2

1

稍微改正了一下,试试看,但还有更多工作要做......

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* Structure declaration */

struct personCatalog {
  char name[50];
  char address[50];
  char cityState[50];
  char zipCode[7];
} ;
const int maxNumberOfPeople = 3; // was 51;

//function to fill structures

void getPerson (struct personCatalog *ArrayOfPointers[]);

int main(int argc, const char * argv[]) {

  struct personCatalog *pointerArray[maxNumberOfPeople];

  getPerson(pointerArray);

}

void getPerson (struct personCatalog *ArrayOfPointers[]){
  struct personCatalog *tempPointer;
  char stringCollector[512];
  int num = 0;

  while ((num < maxNumberOfPeople) && (gets(stringCollector) != 0) ) {

    tempPointer = (struct personCatalog *) malloc(sizeof(struct personCatalog));
    strcpy(tempPointer->name, stringCollector);
    gets(tempPointer->address);
    gets(tempPointer->cityState);
    gets(tempPointer->zipCode);

    ArrayOfPointers[num] = tempPointer;


    printf("name      %s\n", ArrayOfPointers[num]->name);
    printf("address   %s\n", ArrayOfPointers[num]->address);
    printf("cityState %s\n", ArrayOfPointers[num]->cityState);
    printf("zipCode   %s\n", ArrayOfPointers[num]->zipCode);

    num++;
  }
  //ArrayOfPointers[num] = '\0'; this crashed at end of array
}
于 2012-11-24T21:26:08.480 回答
1

有趣的是,代码对我有用,并添加了必要的包括:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

然而,这只适用于合理的输入——代码还有一些改进的余地,但稍后会更多。

您看不到任何输出的原因是您num在将数据分配给结构之后但在打印它之前增加索引 - 即在循环中您总是取消引用尚未分配的指针,换句话说就是垃圾。当您尝试取消引用空指针(或任何不在您的进程内存和段错误中的东西时,这只是一个时间问题。

现在来看看缺陷:

  • malloc() 总是带有两件事:检查返回值和相应的free()free()丢失了,但我知道一旦不再需要数据,代码的其他部分就可以解决这个问题。但是,您没有检查它是否不返回 NULL(即未能分配内存)。这会立即使您的程序停机(由于空指针取消引用而导致的 SEGFAULT)。

  • gets()- 我建议阅读此功能的手册页(如果您在 Windows 上,请在 Internet 上查找)- 它不保证读取数据有任何限制,因此您很容易溢出缓冲区。改为使用fgets()。另一种方法可能是scanf()使用宽度说明符 to %s

  • strcpy()- 与 相同gets()。改为使用strncpy(),除非您确定它不会破坏您的数据。char stringCollector[512]此外,您正在复制char personCatalog.name[50]- 不要那样做。这是不一致的,如果您根据前者的大小进行边界检查,那么您肯定会遇到问题(而不是迟早)。

最后但并非最不重要的一点:一个错误的错误(有时确实很难做到这一点)。

struct personCatalog *pointerArray[51];
...
int maxNumberOfPeople = 51;
if (num < maxNumberOfPeople)) {
    ...
    num++;
    ...
}
ArrayOfPointers[num] = '\0'

在最坏的情况下,您将在后面写ArrayOfPointersArrayOfPointers[51]具体来说)。

使用宏并决定是否要对数组进行 NULL 终止:

#define MAXPEOPLE 50
struct personCatalog *pointerArray[MAXPEOPLE+1]; /* +1 for the NULL terminator */
if (num < MAXPEOPLE)) ...
于 2012-11-24T22:20:34.820 回答