【发布时间】:2015-03-19 05:11:24
【问题描述】:
我有一个字符串数组,我想在它不再有 NULL 指针时扩展它(意味着数组已满)。 我尝试了 realloc 但没有成功,我认为我没有正确地考虑指针。
这是我的代码:
int storage; //global, outside of main
int i, key;
char **people;
char **phones;
printf("Please enter a storage cacpity:\n");
scanf("%d",&storage);
printf("\n");
people=malloc(storage*sizeof(char *));
phones=malloc(storage*sizeof(char *));
for (i=0; i<storage; i++) {
people[i] = NULL;
phones[i] = NULL;
}
void AddNewContact(char * people[], char * phones[]) {
char name[100];
char phone[12];
int i, listfull = 0;
printf("Enter a contact name:\n");
scanf("%s",&name);
printf("Enter a phone number:\n");
scanf("%s",&phone);
for (i=0; i<storage; i++) {
if (people[i]==NULL) {
people[i] = (char *)malloc(strlen(name));
phones[i] = (char *)malloc(strlen(phone));
strcpy(people[i],name);
strcpy(phones[i],phone);
break;
}
listfull = 1;
}
if (listfull == 1) {
storage++;
people = realloc(&people,(storage)*sizeof(char *));
phones = realloc(&phones,(storage)*sizeof(char *));
people[storage-1] = NULL;
phones[storage-1] = NULL;
strcpy(people[storage-1],name);
printf("\nData Base extanded to %d",storage);
}
printf("\n");
return;
}
void PrintAll(char * people[], char * phones[]) {
int i;
for (i=0; i<storage; i++) {
if (NULL != people[i]) {
printf("Name: %s, ",people[i]);
printf("Number: %s\n",phones[i]);
}
}
printf("\n");
return;
}
任何帮助将不胜感激,我坚持了几个小时,没有运气解决这个问题。
【问题讨论】:
-
@NirTzezana:您遇到的具体问题是什么?
-
people和&people不一样。 -
作为一个建议,您应该将
strcpy(people[i], name);和strcpy(phones[i], phone);更改为strncpy(people[i], name);和strncpy(phones[i], phone);。这不会解决你的问题,但它会 NULL 终止字符串。 -
@NirTzezana:你怎么知道?
-
哦,作为第二个建议,请切勿这样做:
people = realloc(&people,(storage)*sizeof(char *));。如果重新分配失败,则返回 NULL,这意味着people变为 NULL 指针。因此,您丢失了指向该内存块的指针。您应该将 realloc 的返回值分配给一个单独的变量和if ( NULL != returnedReallocAddress ) people = returnedReallocAddress;
标签: c arrays string pointers realloc