作者:靜钕孓626 | 来源:互联网 | 2023-05-25 19:26
我有一个字符串数组,当它不再有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
任何帮助都将受到高度赞赏,我坚持了几个小时,没有运气这样做.
1> Iharob Al As..:
你有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 *));
但即使这不是百分之百正确,因为如果realloc
失败,你将覆盖指针,然后你就没有机会清理内存,所以你应该做一些像
void *pointer;
pointer = realloc(people, storage * sizeof(char *));
if (pointer == NULL)
free_people_andCleanUpOtherResourcesAndExitFromThisFunction();
people = pointer;
同样的道理phones
.
第三,你应该总是为一个额外的角色分配空间,终止'\0'
,这个
people[i] = (char *)malloc(strlen(name));
应该读
people[i] = malloc(1 + strlen(name));
请注意我删除了不必要的演员表.
第四,你在第一次迭代中离开循环listfull == 1
,即使有列表还没有完整.
for (i=0; i
我建议在循环之外
listfull = (i == storage);
注意:函数失效的可能性并不重要,如果它理论上会失败,你应该总是检查它是否失败,这样可以节省你几个小时的调试时间来找到一个非常愚蠢的错误,你没有检查是否可能失败.