你好朋友:)我正在练习C编程。在这个程序中,我有一个任务来制作字符串数组。我不知道这里有什么错...可能是关于realloc,我得到的错误是_crtisvalidheappointer
{Person1=Customer,Prospect, Person2=Employee,Customer}
有人可以帮我,告诉我这里我做错了什么?这个函数应该返回字符串数组,但数组应该是双指针(字符串矩阵)
答案 0 :(得分:3)
您需要更改
words = realloc(words, ++wordcnt);
到
words = realloc(words, ++wordcnt * sizeof(*words));
否则你没有分配足够的内存。
words[wordcnt] = malloc(MAX);
这也不正确,您应该访问words[wordcnt-1]
。
答案 1 :(得分:1)
您正在使用realloc
,但您并未将其返回值保存在任何位置。这意味着您指向的指针仍指向已释放的内存并且新分配的内存已泄露。
查看工作功能,您将了解如何正确使用它。
答案 2 :(得分:1)
重新分配双指针时要注意的一件事是 的类型<{1>} 总是sizeof(指针) 。无论问题的数据类型如何,它在任何给定系统上都是相同的。您可以按如下方式一般地重新分配双指针:
realloc
注意: /** realloc array of pointers ('memptr') to twice current
* number of pointer ('*nptrs'). Note: 'nptrs' is a pointer
* to the current number so that its updated value is preserved.
* no pointer size is required as it is known (simply the size
* of a pointer)
*/
void *xrealloc_dp (void *ptr, size_t *n)
{
void **p = ptr;
void *tmp = realloc (p, 2 * *n * sizeof tmp);
if (!tmp) {
fprintf (stderr, "xrealloc_dp() error: virtual memory exhausted.\n");
exit (EXIT_FAILURE); /* or break; to use existing data */
}
p = tmp;
memset (p + *n, 0, *n * sizeof tmp); /* set new pointers NULL */
*n *= 2;
return p;
}
调用是可选的,但如果您已将所有未指定的指针初始化为memset
(例如使用NULL
时,则非常有用哨兵)
note2:您可以自由地传递参数设置要增加的指针的确切数量(要添加的元素),或者根据代码的需要更改当前分配的乘数。