c - 重新分配一个指针数组什么都不做

标签 c arrays string pointers realloc

我有一个字符串数组,当它不再有 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;
}

任何帮助将不胜感激,我坚持了几个小时,但没有运气解决这个问题。

最佳答案

你有 4 个重要的错误,首先你将数组的地址传递给 scanf() 这是错误的,你应该改变

scanf("%s", &name);

scanf("%s", name);

scanf("%s",&phone); 一样,我也应该推荐使用长度说明符给 scanf 来防止缓冲区溢出,例如

scanf("%99s", name);

name 数组的长度 -1,为 '\0' 终止符。

其次,你的realloc调用也是错误的,你应该传递指针而不是它的地址,而不是这个

people = realloc(&people,(storage)*sizeof(char *));

你应该这样做

people = realloc(people, storage * sizeof(char *));

但这也不是 100% 正确,因为万一 realloc 失败,您将覆盖指针,然后您将没有机会清理内存,所以您实际上应该做类似的事情

void *pointer;
pointer = realloc(people, storage * sizeof(char *));
if (pointer == NULL)
    free_people_andCleanUpOtherResourcesAndExitFromThisFunction();
people = pointer;

同样适用于手机

第三,你应该总是为一个额外的字符分配空间,终止 '\0',这个

people[i] = (char *)malloc(strlen(name));

应该阅读

people[i] = malloc(1 + strlen(name));

请注意,我删除了不必要的强制转换。

第四,您在第一次迭代中跳出循环,留下 listfull == 1,即使列表尚未满。

for (i=0; i<storage; i++) {
    if (people[i]==NULL) {
        people[i] = malloc(1 + strlen(name));
        phones[i] = malloc(1 + strlen(phone));
        strcpy(people[i],name);
        strcpy(phones[i],phone);
        break;
    }
    listfull = 1;
}

我会在循环之外推荐这个

listfull = (i == storage);

注意:函数失败的可能性有多大并不重要,如果理论上它会失败,您应该始终检查它是否失败,这将节省您调试时间以找到一个非常愚蠢的错误,您没有检查可能的故障。

关于c - 重新分配一个指针数组什么都不做,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28054407/

相关文章:

arrays - CSV 字符串与数组 : Is this too stringly typed?

c - 如何从库中获取地址信息以在所有进程之间共享?

c - sizeof(array_of_char) 输出奇怪的数字

perl - Perl,将哈希转换为数组

string - lua检查多个值是否相等

c++ - “null-terminated transparent array of elements”中的transparent是什么意思

c++ - 在位数组中找到 N 个 1 位的字符串

c编程难题

javascript - forEach 在客户端具有单文档 firebase 查询?

arrays - 查找数组中指定元素的第一次出现